Hi,
Habe noch eine Lösung gefunden. Sie ist der von cime ähnlich und etwas langsamer aber ca. 20% schneller als die regex-Lösung. Dafür kann man defChar, groupChar, groupRange und das Ausgabeformat übergeben.
Das Format gilt allerdings nur für die Nachkommastellen. Möchte man den ganzen Wert formatiert darstellen, muss man die Rückgabe der Funktion nochmals formatieren (z.B. mit %20s").
Außerdem ist sie auch für Pythonversionen < python 2.4 einsetzbar.
So sieht die Lösung aus:
Code: Alles auswählen
def __formatter(number, format = "%.2f", decChar = ",", groupChar = ".", groupRange = 3):
"""
Convert to required format
number = number to convert
format = python string formatting (%),but only for the decimals
decChar = decimal char for the converted format
groupChar = group char for the converted format
groupRange = group range for the converted format
For example:
__formatter(1234567890.987, "%.2f", ",", ".", 3)
==> 1.234.567.890,99
"""
if abs(number) < 1:
return (format % (number)).replace(".", decChar)
else:
base = int(abs(number))
s = (format % (abs(number) % 1))[2:]
s = s and decChar + s or s
while base:
s = groupChar + str(base)[-groupRange:] + s
base = int(base / 10**groupRange)
return number < 0 and "-" + s[1:] or s[1:]
Den regEx der vorherigen Lösungen habe ich auch nochmals überarbeitet. Zahlen kleiner als Tausend wurden bei z.B. %20.2f nicht korrekt dargestellt. Bei negativen Zahlen größer als 1000 wurde das Minuszeichen entfernt.
Das ist der korrigierte regEx:
Code: Alles auswählen
re.compile("^ *\d*\D\d{1,%s}[ -]*|\d{1,%s}[ -]*" % (3, 3))
Ein weiteres Problem der regEx-Lösung ist, das die Formatierung nicht richtig dargestellt wird. Z.B. wird bei "%20.2f" jede Zahl pro Tausenderpotenz um ein Zeichen (nämlich das Gruppierungszeichen) länger. Das Ergebnis sieht dann folgendermaßen aus:
Code: Alles auswählen
-0,234
66,090
1,000
2,000
3,400
-5,678
612.345,000
612.345,555
9.876.543.210,067
Um dieses Problem zu beheben müßte man den Code noch erweitern. Dadurch wird er aber noch langsamer.
Am besten wäre es natürlich wenn man über den Formatierungsoperator (%) Zahlen auch mit Gruppierungszeichen darstellen könnte. Eine gute Anregung an die Python-Programmierer.