mirror of
https://github.com/python/cpython.git
synced 2024-11-30 13:24:13 +08:00
4b8c6eaf8b
*this* set of patches is Ka-Ping's final sweep: The attached patches update the standard library so that all modules have docstrings beginning with one-line summaries. A new docstring was added to formatter. The docstring for os.py was updated to mention nt, os2, ce in addition to posix, dos, mac.
78 lines
2.2 KiB
Python
78 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()
|