| """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() |