mirror of
				https://github.com/python/cpython.git
				synced 2025-11-03 23:21:29 +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()
 |