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
Verfasst: Dienstag 30. Juni 2009, 07:02
von ferix
Danke bereits gelesen

Aber die Lösungsvariante von Stefan finde ich sehr gut!