Code: Alles auswählen
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import re
#----------------------------------------------------------------------
format_number_0a_regex = re.compile("^ *\d*\D\d{1,3}|\d{1,3} *")
def format_number_0a(number, format = "%.2f", decChar = ",", groupChar = "."):
"""
Convert to required format
number = number to convert
format = python string formatting (%)
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
"""
form_num = groupChar.join(format_number_0a_regex.findall((format % number).replace(".", decChar)[::-1]))[::-1]
return form_num
#----------------------------------------------------------------------
def format_number_0b(number, format = "%.2f", decChar = ",", groupChar = ".", groupRange = 3):
"""
Convert to required format
number = number to convert
format = python string formatting (%)
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
"""
regex = re.compile("^ *\d*\D\d{1,%s}|\d{1,%s} *" % (groupRange, groupRange))
form_num = groupChar.join(regex.findall((format % number).replace(".", decChar)[::-1]))[::-1]
return form_num
#----------------------------------------------------------------------
format_number_1_regex = re.compile( "^ *\d*\D\d{1,3}|\d{1,3} *" )
def format_number_1(
number,
format = "%0.2f",
decimal_char = ",",
group_char = "."
):
"""
Nach einer Idee von Voges, HarryH und Jens.
http://www.python-forum.de/viewtopic.php?t=371
"""
def reverse(string):
# ersatz für string[::-1] welches erst ab v2.3 gibt :(
list = re.findall(".",string)
list.reverse()
return "".join(list)
return reverse(
group_char.join(
format_number_1_regex.findall(
reverse( (format % number).replace(
".", decimal_char)
)
)
)
)
#----------------------------------------------------------------------
format_number_1_regex = re.compile( "^ *\d*\D\d{1,3}|\d{1,3} *" )
def format_number_1b(
number,
format = "%0.2f",
decimal_char = ",",
group_char = "."
):
"""
Nach einer Idee von Voges, HarryH und Jens.
http://www.python-forum.de/viewtopic.php?t=371
"""
def reverse(s):
# ersatz für string[::-1] welches erst ab v2.3 gibt :(
l = map(None, s)
l.reverse()
return ('').join(l)
return reverse(
group_char.join(
format_number_1_regex.findall(
reverse( (format % number).replace(
".", decimal_char)
)
)
)
)
#----------------------------------------------------------------------
def format_number_2(
number,
format = "%0.2f",
decimal_char = ",",
group_char = ".",
group_range = 3
):
"""
Nach einer Idee von Milan.
http://www.python-forum.de/viewtopic.php?t=371
"""
def split(s, size = group_range):
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)
num = (format % number).replace('.', decimal_char)
int_part = num[:num.find(decimal_char)]
return (
reverse(
group_char.join(
split(reverse(int_part))
)
) + num[num.find(decimal_char):]
).replace(" %s" % group_char, " ")
if __name__ == "__main__":
# Testen welche Funktion schneller ist
import time
zahlen = (
66,
1,
2,
3.4,
-5.678,
612345,
612345.555,
987654321.067
)
begin = time.time()
for i in range(10000):
for zahl in zahlen:
x = format_number_0a(zahl)
print "0a:", time.time() - begin
print
begin = time.time()
for i in range(10000):
for zahl in zahlen:
x = format_number_0b(zahl)
print "0b:", time.time() - begin
print
begin = time.time()
for i in range(10000):
for zahl in zahlen:
x = format_number_1(zahl)
print "1:", time.time() - begin
print
begin = time.time()
for i in range(10000):
for zahl in zahlen:
x = format_number_1b(zahl)
print "1b:", time.time() - begin
print
begin = time.time()
for i in range(10000):
for zahl in zahlen:
x = format_number_2(zahl)
print "2:", time.time() - begin
print
Ein guter kompromiss (wenn Python >v2.3) ist wohl die 1b Version... Dort hab ich die reverse() Funktion von Milan eingebaut...