Zahlenausgabe mit Tausenderpunkt

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 1. März 2008, 14:25

Ich habe vergeblich nach einer schon vorhandenen Funktion gesucht, mit der ich beliebige Zahlen (d.h. int oder float) mit DezimalKOMMA und Tausenderpunkten ausgeben kann.

Also etwa so:

Code: Alles auswählen

>>> tausenderpunktausgabe(-2134.98)
'-2.134,98'
Jetzt habe ich mir selbst (gleich mehrere) Funktionen gestrickt, die das schaffen, aber besonders elegant ist das nicht geworden.
Ich werde das Gefühl nicht los, dass es - mit dem richtigen Python Know-how - auch kurz und elegant geht.
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 1. März 2008, 15:11

pütone hat geschrieben:Ich habe vergeblich nach einer schon vorhandenen Funktion gesucht
Hallo pütone!

Die ist auch ziemlich versteckt. Und man muss vorher die Locale einstellen.

Code: Alles auswählen

>>> import locale
>>> locale.setlocale(locale.LC_NUMERIC, "german")
'German_Germany.1252'
>>> locale.format("%.2f", -2134.98, grouping = True)
'-2.134,98'
>>>
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 1. März 2008, 15:23

Hallo Gerold,

super, das ist ein echter Fortschritt.

Bei mir sah es nämlich bis eben noch so aus:

Code: Alles auswählen

def numb_out1(n):
    parts = list(str(abs(n)).replace(".",",").partition(","))
    intg = ""
    while parts[0]:
        intg = parts[0][-3:]+"."+intg
        parts[0] = parts[0][:-3]
    return (n<0)*"-"+intg[:-1]+"".join(parts[1:])
Oder so:

Code: Alles auswählen

def numb_out2(n):
    parts = str(abs(n)).replace(".",",").partition(",")
    digits = list(parts[0])
    pos = [p for p in range(len(digits)%3,len(digits),3) if p>0][::-1]
    for p in pos: digits[p:p] = "."
    return (n<0)*"-"+"".join(digits)+"".join(parts[1:])
Oder so:

Code: Alles auswählen

def numb_out3(n):
    parts = str(abs(n)).replace(".",",").partition(",")
    intg = "   "[len(parts[0])%3:]+parts[0]
    digits = [intg[p:p+3] for p in range(0,len(intg),3)]
    return (n<0)*"-"+".".join(digits).strip(". ")+"".join(parts[1:]
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Samstag 1. März 2008, 15:37

pütone hat geschrieben:das ist ein echter Fortschritt
Hallo pütone!

Dann gefällt dir dieser Thread bestimmt: :lol:

http://www.python-forum.de/topic-371.html

mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Benutzeravatar
numerix
User
Beiträge: 2696
Registriert: Montag 11. Juni 2007, 15:09

Samstag 1. März 2008, 15:55

Hallo Gerold,
Dann gefällt dir dieser Thread bestimmt: http://www.python-forum.de/topic-371.html
Ja, prima. Und als ich ihn eben (zunächst nur) überflogen habe, musste ich feststellen, dass ich diesen Thread auch schonmal in einem anderen Zusammenhang gelesen hatte - wusste ich aber nicht mehr.

Nachdem ich eben ein bisschen mit der locale-Variante herumgespielt habe, finde ich meine Varianten dann doch nicht mehr so schlecht ... :)

Meine Funktionen haben (für das, was ich wollte) den Vorteil, dass sie mit allen Zahlentypen automatisch funktionieren. Um die locale-Variante nutzen zu können, muss ich ja - wenn ich nichts übersehen habe - im Formatstring der format()-Methode den Zahlentyp angeben. Außerdem bei Fließkommazahlen die Anzahl der Nachkommastellen bzw. ich bekomme automatisch 6 Nkst., wenn ich sie nicht einstelle. Ich müsste es also auch in eine kleine umgebende Funktion einpacken, damit ich die gleiche Funktionalität erreiche - kürzer wird das dann am Ende kaum.

Und - praktisch kaum relevant, aber trotzdem interessant - meine selbst gestrickten Funktionen sind schneller als die locale-Variante. Funktion 2 ist etwa genauso schnell (minimal schneller), die Funktionen 1 und 3 etwa doppelt so schnell.

In dem Thread, auf den du verwiesen hast, gibt es ja noch eine re-Variante. Da mir re bisher eher unsympatisch waren, kann ich mich damit nicht so recht anfreunden - aber ist ja angeblich NOCH schneller ...
Antworten