Seite 1 von 1

[Django]Möglichkeit zur Optimierung der Zahlendarstellung?

Verfasst: Freitag 26. Juni 2009, 16:41
von ferix
Hallo,

gibt es in Django eine einfache Möglichkeit Zahlen bei der Ausgabe in Templates zu optimieren??? Habe mal nach einem Template-Filter geschaut, aber keinen gefunden.

Sprich dass zum Beispiel

156968.89


als

156.968,89

dargestellt wird.

Sollte Django dafür kein "Werkzeug" bieten, gibt es dafür vielleicht eine Funktion oder ähnliches in Python selbst, sodass ich die Formatierung in Views anpassen könnte???

Verfasst: Freitag 26. Juni 2009, 16:49
von Dauerbaustelle
Ist glaube ich in Bearbeitung, kannst du dir aber auch selber schreiben:

Code: Alles auswählen

In [1]: import locale

In [6]: locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
Out[6]: 'de_DE.utf8'

In [11]: locale.format('%f', 12374234928234.018348, True)
Out[11]: '12.374.234.928.234,017578

Verfasst: Freitag 26. Juni 2009, 17:02
von ferix
Cool danke funktioniert so.
Jetzt würde ich nur noch gerne den Hintergrund wissen, sprich die Funktionen genauer verstehen, da ich nicht gerne unwissend Code übernehme.

Kann da jemand erklären oder hat direkt den Link zu einer Referenz!?
Wenn nicht Google ich einfach :)

Verfasst: Freitag 26. Juni 2009, 17:28
von Dauerbaustelle

Verfasst: Sonntag 28. Juni 2009, 10:13
von Darii
Dauerbaustelle hat geschrieben:Ist glaube ich in Bearbeitung, kannst du dir aber auch selber schreiben:
Selber schreiben ist aber nicht so schön, endete bei mir in

Code: Alles auswählen

def format_int(value):
    if value is None:
        return "0"
    else:
        str_ = str(value)
        num_fragments, start = divmod(len(str_), 3)
        tmp = start
        fragments = []
        if start:
            fragments.append(str_[0:start])
        for i in range(1, num_fragments + 1):
            fragments.append(str_[tmp:tmp + 3])
            tmp = tmp + 3
        return ".".join(fragments)
das geht bestimmt auch irgendwie kürzer.

Verfasst: Sonntag 28. Juni 2009, 10:53
von Dauerbaustelle
Darii hat geschrieben:das geht bestimmt auch irgendwie kürzer.
*hust*

Code: Alles auswählen

In [1]: import locale

In [6]: locale.setlocale(locale.LC_ALL, 'de_DE.utf8')
Out[6]: 'de_DE.utf8'

In [11]: locale.format('%d', 12374234928234, True)
Out[11]: '12.374.234.928.234

Verfasst: Sonntag 28. Juni 2009, 11:37
von BlackJack
Wobei man da natürlich beachten muss, dass man für die gesamte Anwendung die `locale` umschaltet, was Auswirkungen anderswo haben kann, und dass die Angabe 'de_DE.utf8' nicht portabel ist. Nicht einmal innerhalb von Linux-Systemen.

Verfasst: Sonntag 28. Juni 2009, 13:36
von lunar
Man kann das Babel-Paket für diese Zwecke nutzen:

Code: Alles auswählen

>>> format_decimal(10000.12345, locale='de_DE')
u'10.000,123'
>>> format_decimal(10000.12345, locale='en_GB')
u'10,000.123'
>>> format_decimal(10000.12345, locale='ru_RU')
u'10\xa0000,123'

Verfasst: Sonntag 28. Juni 2009, 16:34
von Darii
Dauerbaustelle hat geschrieben:
Darii hat geschrieben:das geht bestimmt auch irgendwie kürzer.
*hust*
Selber schreiben

Verfasst: Sonntag 28. Juni 2009, 17:05
von sma
Hier ein Selbstschreiben-Vorschlag ohne locale:

Code: Alles auswählen

def fmt(n, digits=2, dec_sep=",", grp_sep="."):
    a, b = ("%.*f" % (digits, n)).split(".")
    a = "".join(reversed([c if not i or i % 3 else c + grp_sep for i, c in enumerate(reversed(a))]))
    return dec_sep.join((a, b))

print fmt(2456.4567)
Stefan

Verfasst: Sonntag 28. Juni 2009, 17:52
von Darii
Herrlich, genau sowas meinte ich ;) Ich hab da mal wieder zu kompliziert gedacht.

Verfasst: Montag 29. Juni 2009, 09:38
von ferix
Sehe ich das nach lesen dieser Beiträge richtig, dass eine Verwendung über local und setlocale eher ungünstig ist und unter Umständen zu Problemen führen könnte?

Demnach eine selbst geschriebene Variante verwenden?

Verfasst: Montag 29. Juni 2009, 09:48
von lunar
ferix hat geschrieben:Sehe ich das nach lesen dieser Beiträge richtig, dass eine Verwendung über local und setlocale eher ungünstig ist und unter Umständen zu Problemen führen könnte?
Ja.
Demnach eine selbst geschriebene Variante verwenden?
Entweder eine selbst geschriebene Variante, oder du verwendest Babel.

Verfasst: Montag 29. Juni 2009, 16:10
von jens
Weitere Lösungsvarianten hier: http://www.python-forum.de/viewtopic.php?t=371

Verfasst: Dienstag 30. Juni 2009, 07:02
von ferix
Danke bereits gelesen :)
Aber die Lösungsvariante von Stefan finde ich sehr gut!