Zahlen formatieren
Hallo,
ich möchte eine Zahl, sagen wir 12000, so formatieren, dass 12.000,00 herauskommt. Wie mach ich das? In PHP gibt's dafür ja number_format, gibts sowas auch für Python?
ich möchte eine Zahl, sagen wir 12000, so formatieren, dass 12.000,00 herauskommt. Wie mach ich das? In PHP gibt's dafür ja number_format, gibts sowas auch für Python?
python
[url=http://www.python-welt.de/][img]http://www.python-welt.de/bilder/banner/banner_100x20.gif[/img][/url]
[url=http://www.python-welt.de/][img]http://www.python-welt.de/bilder/banner/banner_100x20.gif[/img][/url]
Hallo!
Keine Ahnung, ob's für Python sowas gibt. Das Folgende bildet wohl in etwa die PHP-Funktion nach.
Ausgabe: 12.431.554.323,44
HTH
Jan
Keine Ahnung, ob's für Python sowas gibt. Das Folgende bildet wohl in etwa die PHP-Funktion nach.
Code: Alles auswählen
import re
def number_format(zahl):
zahl = "%.2f" % zahl
zahl = zahl.replace(".",",")
nochmal = 1
while nochmal:
(zahl,nochmal) = re.subn(r"(\d)(\d\d\d\D)",r"\1.\2",zahl)
return zahl
print number_format(12431554323.44)
HTH
Jan
hier mal ohne RE. Ich glaube aber nicht, dass man damit schneller läuft, war nur mal ne kleine Bastelei für Pythonversionen, die noch kein RE in der neuen Art unterstützen (Bsp Python 1.4 oder 1.5):
edit: ich habs neugierig wie ich bin doch mla auf Zeit getestet und ohne re isses sogar schneller (1/5 der Zeit). Allerdings sind beide Zeiten verschwindend gering, unterhalb von millisekunden und somit völlig egal. Eleganter find ich trotzdem Voges seine Variante. 
Code: Alles auswählen
def split(s, size):
return map(lambda i: s[i:i+size], xrange(0,len(s),size))
def reverse(s):
l=map(None,s)
l.reverse()
return ('').join(l)
def formatter(num):
num=("%.2f"%num).replace('.',',')
int_part=num[:num.find(',')]
return reverse(('.').join(split(reverse(int_part),3)))+num[num.find(','):]

Hi python,
Gruß
Dookie
Code: Alles auswählen
>>> import locale
>>> locale.setlocale(locale.LC_ALL, '')
'de_DE.ISO-8859-1'
>>> locale.format("%.2f",12000,1)
'12.000,00'
>>>
Dookie

-
- Python-Forum Veteran
- Beiträge: 2010
- Registriert: Freitag 11. Oktober 2002, 18:00
- Wohnort: Salzburg
- Kontaktdaten:
Hi milan,
im Modul locale gibt es ab pythonversion 2.2 die Funktion nl_langinfo() die verschiedene Formatstrings auch für strftime() aus dem modul time, zurückgibt.
Gruß
Dookie
im Modul locale gibt es ab pythonversion 2.2 die Funktion nl_langinfo() die verschiedene Formatstrings auch für strftime() aus dem modul time, zurückgibt.
Code: Alles auswählen
>>> import time
>>> time.strftime(locale.nl_langinfo(locale.D_T_FMT))
'Die 25 Feb 2003 20:00:07 CET'
>>>
Dookie
- jens
- Moderator
- Beiträge: 8483
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Genau das wollte ich nun auch tun, deswegen hab ich noch mal diesen alten Thread rausgekramt...python hat geschrieben:ich möchte eine Zahl, sagen wir 12000, so formatieren, dass 12.000,00 herauskommt.
Hab ein wenig mit locals rumgespielt, aber keine Lösung gefunden.
CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi jens!Jens hat geschrieben:Genau das wollte ich nun auch tun, deswegen hab ich noch mal diesen alten Thread rausgekramt...
Hab ein wenig mit locals rumgespielt, aber keine Lösung gefunden.
Hier ein Auszug aus einem meiner Programme:
Code: Alles auswählen
#----------------------------------------------------------------------
def format_currency(float_number):
"""
Formatiert die uebergebene Zahl
"""
import locale
LC_NUMERIC = "german"
CUR_FORMAT = "%0.2f"
# Richtige Verwendung von LC_NUMERIC setzen
old_lc_numeric = locale.setlocale(locale.LC_NUMERIC)
locale.setlocale(locale.LC_NUMERIC, LC_NUMERIC)
retval = locale.format(CUR_FORMAT, float(float_number))
# Wieder auf das alte LC_NUMERIC umschalten
locale.setlocale(locale.LC_NUMERIC, old_lc_numeric)
return retval
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
- jens
- Moderator
- Beiträge: 8483
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ist schon ziemlich kompliziert, für eine einfache Aufgabe
Es klappt leider bei mir nicht:
EDIT: Jep, auf Hosteurope geht's: http://www.jensdiemer.de/Programmieren/
Allerdings gibt's da keine Tausender Punkte
Also stimmt was auf meinem Lokalen Server nicht

Es klappt leider bei mir nicht:
Könnte allerdings auch an meinen locales Einstellungen, meines Linux Servers liegen?!?!/usr/lib/python2.4/locale.py in setlocale(category=1, locale='german')
379 # convert to string
380 locale = normalize(_build_localename(locale))
381 return _setlocale(category, locale)
382
383 def resetlocale(category=LC_ALL):
global _setlocale = <built-in function setlocale>, category = 1, locale = 'german'
Error: unsupported locale setting
args = ('unsupported locale setting',)
EDIT: Jep, auf Hosteurope geht's: http://www.jensdiemer.de/Programmieren/
Allerdings gibt's da keine Tausender Punkte

Also stimmt was auf meinem Lokalen Server nicht

CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
- jens
- Moderator
- Beiträge: 8483
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Aha, so mach ich's jetzt:
Mit "de_DE.UTF-8" geht's bei mir lokal und bei Hosteurope...
Hab noch das http://starship.python.net/pipermail/py ... .html#6011 gefunden...
Code: Alles auswählen
file_KBytes = item_stat[stat.ST_SIZE]/1024.0
try:
locale.setlocale(locale.LC_ALL, "de_DE.UTF-8")
print "%s KB" % locale.format("%0.1f", file_KBytes, True)
except:
print "%0.1f KB" % file_KBytes
Hab noch das http://starship.python.net/pipermail/py ... .html#6011 gefunden...
CMS in Python: http://www.pylucid.org
GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
- gerold
- Python-Forum Veteran
- Beiträge: 5555
- Registriert: Samstag 28. Februar 2004, 22:04
- Wohnort: Oberhofen im Inntal (Tirol)
- Kontaktdaten:
Hi Jens!jens hat geschrieben:Ist schon ziemlich kompliziert, für eine einfache Aufgabe![]()
[...]Könnte allerdings auch an meinen locales Einstellungen, meines Linux Servers liegen?!?!Error: unsupported locale setting
args = ('unsupported locale setting',)
Ich habe übersehen, dass dieses Programm, von dem ich den Codeausschnitt zitiert habe, unter Windows läuft. Leider kannst du unter Linux keinesfalls davon ausgehen, dass jeder die gleichen bzw. alle Locales zur Verfügung hat. Das kommt darauf an, welche Locales beim Kompilieren in die glibc übersetzt wurden.
Am besten, du verwendest den Tipp im Beitrag von Voges oder Milan. Der funktioniert immer -- sowohl unter Windows -- als auch unter Linux.
lg
Gerold

http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Hallo zusammen,
Habe auch noch etwas herumprobiert.
Bin auf folgende Lösung gekommen:
Funktioniert in etwa doppelt so schnell wie über das 'locale'-Modul!
Schreibt man die Funktion noch etwas um und übergibt die regex direkt,
so ist nochmals ein Geschwindigkeitssteigerung um ca. 30% möglich.
Vielleicht weiß ja jemand noch eine Verbesserung dazu!?
Habe auch noch etwas herumprobiert.
Bin auf folgende Lösung gekommen:
Code: Alles auswählen
import re
def formatter(number, format = "%.2f", dezChar = ",", groupChar = ".", groupRange = 3):
regex = re.compile("^\d*\D?\d{1,%s}|\d{1,%s}" % (groupRange, groupRange))
form_num = groupChar.join(regex.findall((format % number).replace(".", dezChar)[::-1]))[::-1]
return form_num
number = 1234567890.789
print formatter(number, "%.2f")
Schreibt man die Funktion noch etwas um und übergibt die regex direkt,
so ist nochmals ein Geschwindigkeitssteigerung um ca. 30% möglich.
Vielleicht weiß ja jemand noch eine Verbesserung dazu!?
Gruß, Harry
darf ich ma fragen warum das hier so kompliziert gemacht wird?
er will doch nur eine einfache formatierung, die man auch selber schreiben kann, ohne irgendwelche module, oder hab ich das falsch verstanden?
das hier macht exakt das, was er haben will, oder?
er will doch nur eine einfache formatierung, die man auch selber schreiben kann, ohne irgendwelche module, oder hab ich das falsch verstanden?
Code: Alles auswählen
#format_number.py
def format_number(number):
hinter_komma=str(number%1)[2:]
if not hinter_komma:
hinter_komma="00"
elif len(hinter_komma)==1:
hinter_komma+="0"
else:
hinter_komma=hinter_komma[0:2]
string=","+hinter_komma
number=int(number)
x=1
while 1000**x<=number:
string="."+str(number%(1000**x))[0:3]+string
x+=1
string=str(number/(1000**(x-1)))+string
return string
print format_number(input("Zahl: "))