mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 21:51:50 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			76 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			76 lines
		
	
	
	
		
			2.2 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| "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()
 | 
