近日,小爬的工作中,需要將貨幣數字金額(如: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: 壹佰萬零肆拾叄元零壹分
如果您也有類似的需求,趕緊來試試這個好用的函數吧!