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