Seite 1 von 1

Zahlenausgabe mit Tausenderpunkt

Verfasst: Samstag 1. März 2008, 14:25
von numerix
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.

Re: Zahlenausgabe mit Tausenderpunkt

Verfasst: Samstag 1. März 2008, 15:11
von gerold
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
:-)

Verfasst: Samstag 1. März 2008, 15:23
von numerix
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:]

Verfasst: Samstag 1. März 2008, 15:37
von gerold
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
:-)

Verfasst: Samstag 1. März 2008, 15:55
von numerix
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 ...