写了几个将数值转换为金额格式的函数,
将数字转换为大写金额的函数是从网上转载的(不记得出处了)。
num2money( num ) 用于将数字转换为带逗号分割的金额样式,保留两位小数
num2chn( num ) 用于将数字转换为中文大写金额
getNum( string ) 用于从字符串里提取数字
isNum( string ) 用于判断string是否是由数字组成的字符串
num2money( num ) 用于将数字转换为带逗号分割的金额样式,保留两位小数
num2chn( num ) 用于将数字转换为中文大写金额
getNum( string ) 用于从字符串里提取数字
isNum( string ) 用于判断string是否是由数字组成的字符串
import
re
def num2money(num, decimals = 2 , err = '' ):
u ''' 将数字格式化为金额样式,参数为数值,返回字符串
num 要转换的数值
decimals 保留小数位数
err 出现错误时的返回值
'''
try :
s = '' if num >= 0 else ' - '
y = r ' %. ' + str(decimals) + ' f '
x = y % abs(num)
decimal2 = decimals + 1 if decimals else decimals
for i in range(len(x) - decimal2 - 3 , 0, - 3 ):
x = ' %s,%s ' % (x[:i], x[i:])
return ' %s%s ' % (s, x)
except :
return err
def num2chn(nin = None):
u ''' 将数字格式化为中文大写金额,参数必需大于等于零,返回unicode对象 '''
cs = (u ' 零 ' , u ' 壹 ' , u ' 贰 ' , u ' 叁 ' , u ' 肆 ' , u ' 伍 ' , u ' 陆 ' , u ' 柒 ' , u ' 捌 ' , u ' 玖 ' , u ' ◇ ' ,
u ' 分 ' , u ' 角 ' , u ' 圆 ' , u ' 拾 ' , u ' 佰 ' , u ' 仟 ' , u ' 万 ' , u ' 拾 ' , u ' 佰 ' , u ' 仟 ' , u ' 亿 ' , u ' 拾 ' , u ' 佰 ' , u ' 仟 ' , u ' 万 ' )
st = ''
st1 = ''
s = ' %0.2f ' % (nin)
sln = len(s)
if sln > 15 :
return None
fg = (nin < 1 )
for i in range(0, sln - 3 ):
ns = ord(s[sln - i - 4 ]) - ord( ' 0 ' )
st = iif((ns == 0) and (fg or (i == 8 ) or (i == 4 ) or (i == 0)), '' , cs[ns])
+ iif((ns == 0) and ((i != 8 ) and (i != 4 ) and (i != 0) or fg and (i == 0)), '' , cs[i + 13 ]) + st
fg = (ns == 0)
fg = False
for i in [ 1 , 2 ]:
ns = ord(s[sln - i]) - ord( ' 0 ' )
st1 = iif((ns == 0) and ((i == 1 ) or (i == 2 ) and (fg or (nin < 1 ))), '' , cs[ns])
+ iif((ns > 0), cs[i + 10 ], iif((i == 2 ) or fg, '' , u ' 整 ' )) + st1
fg = (ns == 0)
st.replace(u ' 亿万 ' , u ' 万 ' )
return iif(nin == 0, u ' 零 ' , st + st1)
def getNum(x):
u ''' 从字符串中提取数字,参数为字符串,返回字符串
如:getNum('123,456.2')返回123456.2 '''
y = re.sub( ' [^d-.]* ' , '' , x)
if isNum(y):
return y
else :
return ' 0 '
def iif(b, s1, s2):
u ''' 相当于C语言中的"?:"操作符 '''
if b:
return s1
else :
return s2
def isNum(x):
u ''' 判断是否为数值 '''
return __isSuited ( ' ^-?d+(,d{3,3})*.?d*$ ' , str(x))
def __isSuited (regex, subject):
if re.match(regex, subject):
return 1
else :
return 0
def num2money(num, decimals = 2 , err = '' ):
u ''' 将数字格式化为金额样式,参数为数值,返回字符串
num 要转换的数值
decimals 保留小数位数
err 出现错误时的返回值
'''
try :
s = '' if num >= 0 else ' - '
y = r ' %. ' + str(decimals) + ' f '
x = y % abs(num)
decimal2 = decimals + 1 if decimals else decimals
for i in range(len(x) - decimal2 - 3 , 0, - 3 ):
x = ' %s,%s ' % (x[:i], x[i:])
return ' %s%s ' % (s, x)
except :
return err
def num2chn(nin = None):
u ''' 将数字格式化为中文大写金额,参数必需大于等于零,返回unicode对象 '''
cs = (u ' 零 ' , u ' 壹 ' , u ' 贰 ' , u ' 叁 ' , u ' 肆 ' , u ' 伍 ' , u ' 陆 ' , u ' 柒 ' , u ' 捌 ' , u ' 玖 ' , u ' ◇ ' ,
u ' 分 ' , u ' 角 ' , u ' 圆 ' , u ' 拾 ' , u ' 佰 ' , u ' 仟 ' , u ' 万 ' , u ' 拾 ' , u ' 佰 ' , u ' 仟 ' , u ' 亿 ' , u ' 拾 ' , u ' 佰 ' , u ' 仟 ' , u ' 万 ' )
st = ''
st1 = ''
s = ' %0.2f ' % (nin)
sln = len(s)
if sln > 15 :
return None
fg = (nin < 1 )
for i in range(0, sln - 3 ):
ns = ord(s[sln - i - 4 ]) - ord( ' 0 ' )
st = iif((ns == 0) and (fg or (i == 8 ) or (i == 4 ) or (i == 0)), '' , cs[ns])
+ iif((ns == 0) and ((i != 8 ) and (i != 4 ) and (i != 0) or fg and (i == 0)), '' , cs[i + 13 ]) + st
fg = (ns == 0)
fg = False
for i in [ 1 , 2 ]:
ns = ord(s[sln - i]) - ord( ' 0 ' )
st1 = iif((ns == 0) and ((i == 1 ) or (i == 2 ) and (fg or (nin < 1 ))), '' , cs[ns])
+ iif((ns > 0), cs[i + 10 ], iif((i == 2 ) or fg, '' , u ' 整 ' )) + st1
fg = (ns == 0)
st.replace(u ' 亿万 ' , u ' 万 ' )
return iif(nin == 0, u ' 零 ' , st + st1)
def getNum(x):
u ''' 从字符串中提取数字,参数为字符串,返回字符串
如:getNum('123,456.2')返回123456.2 '''
y = re.sub( ' [^d-.]* ' , '' , x)
if isNum(y):
return y
else :
return ' 0 '
def iif(b, s1, s2):
u ''' 相当于C语言中的"?:"操作符 '''
if b:
return s1
else :
return s2
def isNum(x):
u ''' 判断是否为数值 '''
return __isSuited ( ' ^-?d+(,d{3,3})*.?d*$ ' , str(x))
def __isSuited (regex, subject):
if re.match(regex, subject):
return 1
else :
return 0