写了几个将数值转换为金额格式的函数,将数字转换为大写金额的函数是从网上转载的(不记得出处了)。
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
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
487

被折叠的 条评论
为什么被折叠?



