传入的参数 num:如果是数值,则超过长整型最大值(约14位长度)会被截尾; 如果是字符串,则不受影响。 以下代码最长可转整数部分20位,应该足够了毕竟世界首富、或者两只马也没这么钱啊。如果还需要更长,只要在cnStr[2]里添加更多汉语的数字单位:“京”10^16后面还有:垓、秭、穰、沟、涧、正、载、极10^48。 (扩展资料:“千极”之后还有佛教中的数量单位:恒河沙、阿僧只、那由他、不可思议、无量、大数。1大数是不是10^72,到底对不对0多得没点过来^-^)
def Translate(num): '''数字转人民币格式''' #判断参数类型 if type(num)==type(''): try: f=float(num) except: return u'金额字符串无法转换成数字!' if f<0: num=num[1:] tmp = num.split('.') elif type(num) in [type(0),type(0.0)]: fNum=1.0e+16 # 如果是数字大于100兆会被截尾处理,字符串不受影响 if not 0<=num<fNum: return f'金额必须为非负数且小于{fNum}!' tmp = str(num).split('.') else: return u'金额必须是数字或字符串!' #汉字格式字符串 ret,cn='', ['']*3 cnStr = (u'角分整',u'零壹贰叁肆伍陆柒捌玖',u'元拾佰仟万拾佰仟亿拾佰仟兆拾佰仟京拾佰仟') for i in range(3): cn[i]=[c for c in cnStr[i]] if len(tmp[0])>len(cn[2]): return u'金额数值过大,已超过设置的最大值!' if len(tmp)>1 and len(tmp[1])>2: tmp[1]=tmp[1][:2] #小数大于2位截尾处理 #转换整数和小数 for i,n in enumerate(reversed(list(tmp[0]))): ret = cn[1][int(n)]+cn[2][i]+ret if len(tmp)>1: if tmp[0][-1]=='0': ret += cn[1][0] for i,n in enumerate(list(tmp[1])): ret += cn[1][int(n)] + cn[0][i] #根据书写规则替换掉不该出现的字串 for i in range(2): ret=ret.replace(cn[1][0]+cn[0][i],cn[1][0]) for i in range(1,4): ret=ret.replace(cn[1][0]+cn[2][i],cn[1][0]) for i in range(3,1,-1): ret=ret.replace(cn[1][0]*i,cn[1][0]) for i in range(0,len(cn[2]),4): ret=ret.replace(cn[1][0]+cn[2][i],cn[2][i]) for i in range(4,10,4): ret=ret.replace(cn[2][i+4]+cn[2][i],cn[2][i+4]) if ret[0] in {cn[1][0],cn[2][0]}: ret=ret[1:] if len(ret)>1: if ret[-1] == cn[1][0]: ret=ret[:-1]+cn[0][2] if ret[-1] == cn[2][0]: ret+=cn[0][2] if ret[0] in {cn[1][0],cn[2][0]}: ret=ret[1:] else: ret=cn[1][0]+cn[2][0] return ret '''========================================================''' #测试转换字符串 print(Translate('abc12.5')) print(Translate('123.0.0')) print(Translate('-123.00')) print(Translate('100.458')) print(Translate('100')) print(Translate('.2')) print(Translate('.02')) print(Translate('0.0')) print(Translate('0.')) print(Translate('.0')) print(Translate('90045020500138.56')) print(Translate('901450205001238.56')) print(Translate('9124502050012389.56')) print(Translate('61288888000000000009.56')) print(Translate('7861388888000000000003.23')) print() #产生随机数验证 from random import * for i in range(100): n=round(random()*10**randrange(1,17),2) print(f'{n:18}',Translate(n)) print() print(Translate(12)) print(Translate(10.1)) print(Translate(1.01)) print(Translate(2.)) print(Translate(.2)) print(Translate(.02)) print(Translate(0.0)) print(Translate(0.)) print(Translate(.0))
测试结果:
金额字符串无法转换成数字! 金额字符串无法转换成数字! 壹佰贰拾叁元整 壹佰元肆角伍分 壹佰元整 贰角 贰分 零元 零元 零元 玖拾兆零肆佰伍拾亿贰仟零伍拾万零壹佰叁拾捌元伍角陆分 玖佰零壹兆肆仟伍佰零贰亿零伍佰万壹仟贰佰叁拾捌元伍角陆分 玖仟壹佰贰拾肆兆伍仟零贰拾亿伍仟零壹万贰仟叁佰捌拾玖元伍角陆分 陆仟壹佰贰拾捌京捌仟捌佰捌拾捌兆零玖元伍角陆分 金额数值过大,已超过设置的最大值! 78.63 柒拾捌元陆角叁分 532910517.61 伍亿叁仟贰佰玖拾壹万零伍佰壹拾柒元陆角壹分 91088427148883.98 玖拾壹兆零捌佰捌拾肆亿贰仟柒佰壹拾肆万捌仟捌佰捌拾叁元玖角捌分 23907.18 贰万叁仟玖佰零柒元壹角捌分 10905445734660.77 壹拾兆玖仟零伍拾肆亿肆仟伍佰柒拾叁万肆仟陆佰陆拾元柒角柒分 3.21 叁元贰角壹分 133357.11 壹拾叁万叁仟叁佰伍拾柒元壹角壹分 92075616.81 玖仟贰佰零柒万伍仟陆佰壹拾陆元捌角壹分 470623129148281.75 肆佰柒拾兆陆仟贰佰叁拾壹亿贰仟玖佰壹拾肆万捌仟贰佰捌拾壹元柒角伍分 5268698975.12 伍拾贰亿陆仟捌佰陆拾玖万捌仟玖佰柒拾伍元壹角贰分 138562118363.39 壹仟叁佰捌拾伍亿陆仟贰佰壹拾壹万捌仟叁佰陆拾叁元叁角玖分 38.16 叁拾捌元壹角陆分 1.07 壹元零柒分 659606310.98 陆亿伍仟玖佰陆拾万陆仟叁佰壹拾元玖角捌分 554063575.54 伍亿伍仟肆佰零陆万叁仟伍佰柒拾伍元伍角肆分 95188488.28 玖仟伍佰壹拾捌万捌仟肆佰捌拾捌元贰角捌分 90322976709737.3 玖拾兆叁仟贰佰贰拾玖亿柒仟陆佰柒拾万玖仟柒佰叁拾柒元叁角 260947553.2 贰亿陆仟零玖拾肆万柒仟伍佰伍拾叁元贰角 94279.87 玖万肆仟贰佰柒拾玖元捌角柒分 934777940.33 玖亿叁仟肆佰柒拾柒万柒仟玖佰肆拾元叁角叁分 815949408.89 捌亿壹仟伍佰玖拾肆万玖仟肆佰零捌元捌角玖分 78920.72 柒万捌仟玖佰贰拾元柒角贰分 5139891720.55 伍拾壹亿叁仟玖佰捌拾玖万壹仟柒佰贰拾元伍角伍分 650589924902298.0 陆佰伍拾兆伍仟捌佰玖拾玖亿贰仟肆佰玖拾万贰仟贰佰玖拾捌元整 90.42 玖拾元肆角贰分 364.3 叁佰陆拾肆元叁角 4534573.24 肆佰伍拾叁万肆仟伍佰柒拾叁元贰角肆分 679757203079.07 陆仟柒佰玖拾柒亿伍仟柒佰贰拾万叁仟零柒拾玖元零柒分 642773.58 陆拾肆万贰仟柒佰柒拾叁元伍角捌分 66.3 陆拾陆元叁角 4071402630588777.5 肆仟零柒拾壹兆肆仟零贰拾陆亿叁仟零伍拾捌万捌仟柒佰柒拾柒元伍角 9300888286906.88 玖兆叁仟零捌亿捌仟捌佰贰拾捌万陆仟玖佰零陆元捌角捌分 68099730655.82 陆佰捌拾亿玖仟玖佰柒拾叁万零陆佰伍拾伍元捌角贰分 897837561192.22 捌仟玖佰柒拾捌亿叁仟柒佰伍拾陆万壹仟壹佰玖拾贰元贰角贰分 491314127.45 肆亿玖仟壹佰叁拾壹万肆仟壹佰贰拾柒元肆角伍分 574370.48 伍拾柒万肆仟叁佰柒拾元肆角捌分 67119.07 陆万柒仟壹佰壹拾玖元零柒分 116784440690.59 壹仟壹佰陆拾柒亿捌仟肆佰肆拾肆万零陆佰玖拾元伍角玖分 3538317930136.68 叁兆伍仟叁佰捌拾叁亿壹仟柒佰玖拾叁万零壹佰叁拾陆元陆角捌分 174782037891.4 壹仟柒佰肆拾柒亿捌仟贰佰零叁万柒仟捌佰玖拾壹元肆角 9005130696809.79 玖兆零伍拾壹亿叁仟零陆拾玖万陆仟捌佰零玖元柒角玖分 54152682188201.57 伍拾肆兆壹仟伍佰贰拾陆亿捌仟贰佰壹拾捌万捌仟贰佰零壹元伍角柒分 7874238.0 柒佰捌拾柒万肆仟贰佰叁拾捌元整 87201420561.03 捌佰柒拾贰亿零壹佰肆拾贰万零伍佰陆拾壹元零叁分 9088511743.73 玖拾亿捌仟捌佰伍拾壹万壹仟柒佰肆拾叁元柒角叁分 45824762217270.39 肆拾伍兆捌仟贰佰肆拾柒亿陆仟贰佰贰拾壹万柒仟贰佰柒拾元零叁角玖分 970036043919.77 玖仟柒佰亿叁仟陆佰零肆万叁仟玖佰壹拾玖元柒角柒分 42.88 肆拾贰元捌角捌分 495963434010.35 肆仟玖佰伍拾玖亿陆仟叁佰肆拾叁万肆仟零壹拾元叁角伍分 8762144.86 捌佰柒拾陆万贰仟壹佰肆拾肆元捌角陆分 0.39 叁角玖分 37282.09 叁万柒仟贰佰捌拾贰元零玖分 92067475408.28 玖佰贰拾亿陆仟柒佰肆拾柒万伍仟肆佰零捌元贰角捌分 551.45 伍佰伍拾壹元肆角伍分 193.11 壹佰玖拾叁元壹角壹分 535166688139790.75 伍佰叁拾伍兆壹仟陆佰陆拾陆亿捌仟捌佰壹拾叁万玖仟柒佰玖拾元零柒角伍分 2748704.92 贰佰柒拾肆万捌仟柒佰零肆元玖角贰分 97.84 玖拾柒元捌角肆分 9453.33 玖仟肆佰伍拾叁元叁角叁分 4029772050738.78 肆兆零贰佰玖拾柒亿柒仟贰佰零伍万零柒佰叁拾捌元柒角捌分 7185012601661807.0 柒仟壹佰捌拾伍兆零壹佰贰拾陆亿零壹佰陆拾陆万壹仟捌佰零柒元整 463216994.46 肆亿陆仟叁佰贰拾壹万陆仟玖佰玖拾肆元肆角陆分 7.71 柒元柒角壹分 2183472.12 贰佰壹拾捌万叁仟肆佰柒拾贰元壹角贰分 5319.1 伍仟叁佰壹拾玖元壹角 811388.33 捌拾壹万壹仟叁佰捌拾捌元叁角叁分 7039884793.74 柒拾亿叁仟玖佰捌拾捌万肆仟柒佰玖拾叁元柒角肆分 8352849.81 捌佰叁拾伍万贰仟捌佰肆拾玖元捌角壹分 8414787833.4 捌拾肆亿壹仟肆佰柒拾捌万柒仟捌佰叁拾叁元肆角 5805.67 伍仟捌佰零伍元陆角柒分 63.85 陆拾叁元捌角伍分 5426494813114542.0 伍仟肆佰贰拾陆兆肆仟玖佰肆拾捌亿壹仟叁佰壹拾壹万肆仟伍佰肆拾贰元整 1652222.06 壹佰陆拾伍万贰仟贰佰贰拾贰元零陆分 434459299788.28 肆仟叁佰肆拾肆亿伍仟玖佰贰拾玖万玖仟柒佰捌拾捌元贰角捌分 9178171204939016.0 玖仟壹佰柒拾捌兆壹仟柒佰壹拾贰亿零肆佰玖拾叁万玖仟零壹拾陆元整 99624508.02 玖仟玖佰陆拾贰万肆仟伍佰零捌元零贰分 1791557576970805.8 壹仟柒佰玖拾壹兆伍仟伍佰柒拾伍亿柒仟陆佰玖拾柒万零捌佰零伍元捌角 574.27 伍佰柒拾肆元贰角柒分 114633735791625.06 壹佰壹拾肆兆陆仟叁佰叁拾柒亿叁仟伍佰柒拾玖万壹仟陆佰贰拾伍元零陆分 8013137.48 捌佰零壹万叁仟壹佰叁拾柒元肆角捌分 50658637.63 伍仟零陆拾伍万捌仟陆佰叁拾柒元陆角叁分 800434220597.8 捌仟零肆亿叁仟肆佰贰拾贰万零伍佰玖拾柒元捌角 1306226838673.28 壹兆叁仟零陆拾贰亿贰仟陆佰捌拾叁万捌仟陆佰柒拾叁元贰角捌分 1975734804.47 壹拾玖亿柒仟伍佰柒拾叁万肆仟捌佰零肆元肆角柒分 60.92 陆拾元零玖角贰分 40.03 肆拾元零叁分 2606176712982.49 贰兆陆仟零陆拾壹亿柒仟陆佰柒拾壹万贰仟玖佰捌拾贰元肆角玖分 44851655780.14 肆佰肆拾捌亿伍仟壹佰陆拾伍万伍仟柒佰捌拾元壹角肆分 922209879494.66 玖仟贰佰贰拾贰亿零玖佰捌拾柒万玖仟肆佰玖拾肆元陆角陆分 140847028.76 壹亿肆仟零捌拾肆万柒仟零贰拾捌元柒角陆分 5334816938744540.0 伍仟叁佰叁拾肆兆捌仟壹佰陆拾玖亿叁仟捌佰柒拾肆万肆仟伍佰肆拾元整 141386976.28 壹亿肆仟壹佰叁拾捌万陆仟玖佰柒拾陆元贰角捌分 7805056422.25 柒拾捌亿零伍佰零伍万陆仟肆佰贰拾贰元贰角伍分 44831.97 肆万肆仟捌佰叁拾壹元玖角柒分 7.65 柒元陆角伍分 798488177.29 柒亿玖仟捌佰肆拾捌万捌仟壹佰柒拾柒元贰角玖分 8605715496.27 捌拾陆亿零伍佰柒拾壹万伍仟肆佰玖拾陆元贰角柒分 796777067098.38 柒仟玖佰陆拾柒亿柒仟柒佰零陆万柒仟零玖拾捌元叁角捌分 7131.28 柒仟壹佰叁拾壹元贰角捌分 32194956.06 叁仟贰佰壹拾玖万肆仟玖佰伍拾陆元零陆分 壹拾贰元整 壹拾元零壹角 壹元零壹分 贰元整 贰角 贰分 零元 零元 零元
其中对规则:'角'结尾,“整"可加可不加,作不加整处理。
如果还有错误,请自行修改“替换规则”部分的代码即可。