[Django]Möglichkeit zur Optimierung der Zahlendarstellung?

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

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???
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

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 :)
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

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.
Dauerbaustelle
User
Beiträge: 996
Registriert: Mittwoch 9. Januar 2008, 13:48

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
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.
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'
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Dauerbaustelle hat geschrieben:
Darii hat geschrieben:das geht bestimmt auch irgendwie kürzer.
*hust*
Selber schreiben
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

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
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Herrlich, genau sowas meinte ich ;) Ich hab da mal wieder zu kompliziert gedacht.
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

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?
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.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Weitere Lösungsvarianten hier: http://www.python-forum.de/viewtopic.php?t=371

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
ferix
User
Beiträge: 128
Registriert: Sonntag 1. Juni 2008, 18:21

Danke bereits gelesen :)
Aber die Lösungsvariante von Stefan finde ich sehr gut!
Antworten