thx, harry: prob gelöst:
hier auch gleich nochma ein geschwindigkeitsvergleich:
Code: Alles auswählen
# -*- coding: cp1252 -*-
#format_number.py
import string
#----------------------------------------------------------------------
def format_number_0b(number,format="%0.2f",comma=",",thousand=".",grouplength=3):
if abs(number) < 10**grouplength:
return (format % (number)).replace(".", comma)
if format[-1]=="f":
vor_komma,hinter_komma=string.split(format % number,".")
else:
vor_komma=format % number
comma=""
hinter_komma=""
#Hier
anz_leer=0
for i in vor_komma:
if i==" ":
anz_leer+=1
else:
break
vor_komma=vor_komma[anz_leer:]
#bis hier
len_vor_komma=len(vor_komma)
for i in range(grouplength,len_vor_komma+(len_vor_komma-1)/(grouplength+1)-(number<0),grouplength+1):
vor_komma=vor_komma[0:-(i)]+thousand+vor_komma[-(i):]
return anz_leer*" "+vor_komma+comma+hinter_komma
#----------------------------------------------------------------------
def format_number_5(number, format = "%.2f", decChar = ",", groupChar = ".", groupRange = 3):
"""
by HarryH & mawe
http://www.python-forum.de/viewtopic.php?p=20943#20943
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) < 10**groupRange:
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:]
if __name__ == "__main__":
# Testen welche Funktion schneller ist
import time
zahlen = (
66,
1,
2,
3.4,
-5.678,
-123456789.348,
612345,
612345.555,
987654321.067,
8756832640,
354,
816523
)
formate = (
"%.2f",
"%30.3f",
"%10i"
)
groups = (
2,
3,
4,
5
)
anz=100000
for x in range(2):
begin = time.time()
for i in range(1000):
for format in formate:
for zahl in zahlen:
for group in groups:
x = format_number_0b(zahl,format=format,grouplength=group)
print "0b:", time.time() - begin
print
begin = time.time()
for i in range(1000):
for format in formate:
for zahl in zahlen:
for group in groups:
x = format_number_5(zahl,format=format,groupRange=group)
print "5:", time.time() - begin
print
Ergebnis:
Code: Alles auswählen
0b: 2.5150001049
5: 2.03099989891
0b: 2.48399996758
5: 2.03100013733
PS: @harry: bei den Formaten "%30.3f","%10i" macht deins probs ...
EDIT by mawe: Smilies deaktiviert (cime, bitte schau Dir Deine Beiträge an bevor Du sie absendest ;) )