近日,小爬的工作中,需要将货币数字金额(如:123234.56)转化成汉字大写的形式。网络上看了一圈他人博客上的自定义函数,稍微都存有瑕疵,不符合汉语习惯:
1、比如,“六分”不能被转化为“零角六分”,“.00"转为了”零角零分“灯,着实有些拗口;
2、有的支持的位数不够多,只定义了一万以下的数字转化方法,这样的函数有它的局限性。
小爬最后找到一个他人写的、效果比较理想的js函数,稍加修改,然后用python的语法重新实现了,可以很完美地实现上述金额转化为大写的要求,支持的数大小可以超过一亿,供参考!
def formatCurrency(currencyDigits): '''本函数旨在将数字化的金额(不含千分符)转化为中文的大写金额''' maximum_number=99999999999.99 cn_zero="零" cn_one="壹" cn_two="贰" cn_three="叁" cn_four="肆" cn_five="伍" cn_six="陆" cn_seven="柒" cn_eight="捌" cn_nine="玖" cn_ten="拾" cn_hundred="佰" cn_thousand="仟" cn_ten_thousand="万" cn_hundred_million="亿" cn_symbol="人民币" cn_dollar="元" cn_ten_cent="角" cn_cent="分" cn_integer="整" integral=None decimal=None outputCharacters=None parts=None digits, radices, bigRadices, decimals=None,None,None,None zeroCount=None i, p, d=None,None,None quotient, modulus=None ,None currencyDigits=str(currencyDigits) if currencyDigits=="": return ""
if float(currencyDigits)>maximum_number: print("转换金额过大!") return "" parts = currencyDigits.split(".") if len(parts)>1: integral = parts[0] decimal = parts[1] decimal=decimal[0:2] if decimal=="0" or decimal=="00": decimal=""
else: integral=parts[0] decimal="" digits=[cn_zero,cn_one,cn_two,cn_three,cn_four,cn_five,cn_six,cn_seven,cn_eight,cn_nine] radices=["",cn_ten,cn_hundred,cn_thousand] bigRadices=["",cn_ten_thousand,cn_hundred_million] decimals=[cn_ten_cent,cn_cent] outputCharacters = ""
if int(integral)>0: zeroCount = 0 for i in range(len(integral)): p = len(integral) - i - 1 d = integral[i] quotient = int(p / 4) modulus = p % 4
if d=="0": zeroCount+=1
else: if zeroCount>0: outputCharacters += digits[0] zeroCount=0 outputCharacters = outputCharacters+ digits[int(d)] + radices[modulus] if modulus==0 and zeroCount < 4: outputCharacters =outputCharacters + bigRadices[quotient] outputCharacters += cn_dollar if decimal!="": jiao = decimal[0] if jiao=="": jiao="0"
try: fen = decimal[1] except: fen="0"
if fen=="": fen="0"
if jiao=="0" and fen=="0": pass
if jiao=="0" and fen !="0": outputCharacters = outputCharacters + cn_zero + digits[int(fen)] + decimals[1] if jiao !="0" and fen=="0": outputCharacters =outputCharacters + digits[int(jiao)] + decimals[0] if jiao!="0" and fen !="0": outputCharacters =outputCharacters + digits[int(jiao)] + decimals[0] outputCharacters =outputCharacters + digits[int(fen)] + decimals[1] if outputCharacters == "": outputCharacters = cn_zero + cn_dollar if decimal=="": outputCharacters = outputCharacters+ cn_integer outputCharacters = outputCharacters return outputCharacters
小爬随便输入几个较大的货币数字给这个函数,输出的结果非常理想:
1 for currency in [23104214618.134,23423424.22,20012.35,23456.00,104213421.10,1000043.01]: 2 capital_currency=formatCurrency(currency) 3 print(str(currency)+":\t"+capital_currency)
结果如下:
23104214618.134: 贰佰叁拾壹亿零肆佰贰拾壹万肆仟陆佰壹拾捌元壹角叁分 23423424.22: 贰仟叁佰肆拾贰万叁仟肆佰贰拾肆元贰角贰分 20012.35: 贰万零壹拾贰元叁角伍分 23456.0: 贰万叁仟肆佰伍拾陆元整 104213421.1: 壹亿零肆佰贰拾壹万叁仟肆佰贰拾壹元壹角 1000043.01: 壹佰万零肆拾叁元零壹分
如果您也有类似的需求,赶紧来试试这个好用的函数吧!