"""Support for number formatting using the current locale settings."""
# Author: Martin von Loewis
from _locale import *
import string
#perform the grouping from right to left
def _group(s):
conv=localeconv()
grouping=conv['grouping']
if not grouping:return s
result=""
while s and grouping:
# if grouping is -1, we are done
if grouping[0]==CHAR_MAX:
break
# 0: re-use last group ad infinitum
elif grouping[0]!=0:
#process last group
group=grouping[0]
grouping=grouping[1:]
if result:
result=s[-group:]+conv['thousands_sep']+result
else:
result=s[-group:]
s=s[:-group]
if s and result:
result=s+conv['thousands_sep']+result
return result
def format(f,val,grouping=0):
"""Formats a value in the same way that the % formatting would use,
but takes the current locale into account.
Grouping is applied if the third parameter is true."""
result = f % val
fields = string.splitfields(result,".")
if grouping:
fields[0]=_group(fields[0])
if len(fields)==2:
return fields[0]+localeconv()['decimal_point']+fields[1]
elif len(fields)==1:
return fields[0]
else:
raise Error,"Too many decimal points in result string"
def str(val):
"""Convert float to integer, taking the locale into account."""
return format("%.12g",val)
def atof(str,func=string.atof):
"Parses a string as a float according to the locale settings."
#First, get rid of the grouping
s=string.splitfields(str,localeconv()['thousands_sep'])
str=string.join(s,"")
#next, replace the decimal point with a dot
s=string.splitfields(str,localeconv()['decimal_point'])
str=string.join(s,'.')
#finally, parse the string
return func(str)
def atoi(str):
"Converts a string to an integer according to the locale settings."
return atof(str,string.atoi)
def test():
setlocale(LC_ALL,"")
#do grouping
s1=format("%d",123456789,1)
print s1,"is",atoi(s1)
#standard formatting
s1=str(3.14)
print s1,"is",atof(s1)
if __name__=='__main__':
test()
|