婁七明,許海成,孫建洪
(紅河學院工學院,云南蒙自 661199)
Python是一種跨平臺的面向?qū)ο蟮哪_本語言,廣泛用于Web開發(fā)、云計算、人工智能、金融分析、科學計算等領(lǐng)域。隨著信息化建設(shè)的不斷推進,辦公自動化程度的不斷提高,日常工作中很多票據(jù)和經(jīng)濟合同等都需要打印。這些票據(jù)和經(jīng)濟合同中通常涉及到大寫金額,這就需要將用阿拉伯數(shù)字表示的金額轉(zhuǎn)換成人民幣大寫形式。相關(guān)文獻[1][2]實現(xiàn)了基于C#、T-SQL等語言的大寫金額轉(zhuǎn)換算法,這些算法中把阿拉伯數(shù)字轉(zhuǎn)換成對應(yīng)的大寫漢字都是使用多分支結(jié)構(gòu)實現(xiàn)的。為此,本文提出了一種基于字典的大寫金額轉(zhuǎn)換方法,并用Python實現(xiàn)了該算法。該算法簡單易懂,具有很好的可擴充性和較強的通用性。
要把阿拉伯數(shù)字轉(zhuǎn)換成用漢字表示的大寫金額,可以把整數(shù)部分和小數(shù)部分分開進行轉(zhuǎn)換,然后把轉(zhuǎn)換結(jié)果合并成一個字符串。整數(shù)部分的轉(zhuǎn)換規(guī)則如下:
(1)非零數(shù)字轉(zhuǎn)換成對應(yīng)的漢字并加上相應(yīng)數(shù)位對應(yīng)的單位,比如4310轉(zhuǎn)換為“肆仟叁佰壹拾圓”;
(2)億位不為零時,億位要加上“億”;萬位不為零時,萬位要加上“萬”;
(3)非0的阿拉伯數(shù)字之間出現(xiàn)一個或者多個0時,大寫金額中間對應(yīng)處要加一個“零”;如果非0的阿拉伯數(shù)字之后所有數(shù)字都為0,則大寫金額中這個數(shù)字后面不加“零”,比如10100,轉(zhuǎn)換為“壹萬零壹佰圓”。
小數(shù)部分的轉(zhuǎn)換規(guī)則如下:
(1)小數(shù)部分為0,轉(zhuǎn)換為“整”或“正”;
(2)角位為0,分位不為0,轉(zhuǎn)換為“零*分”,*代表分位數(shù)字對應(yīng)的漢字;
(3)角位為不為0,分位為0,轉(zhuǎn)換為“*角”,*代表角位數(shù)字對應(yīng)的漢字;
(4)角位和分位都不為0,轉(zhuǎn)換為“*角*分”,*代表相應(yīng)數(shù)字對應(yīng)的漢字。
為了簡化算法,分別取出要轉(zhuǎn)換的阿拉伯數(shù)字的整數(shù)部分和小數(shù)部分。然后把整數(shù)部分和小數(shù)部分按照前面給出的轉(zhuǎn)換規(guī)則分別轉(zhuǎn)換成對應(yīng)的字符串,然后把整數(shù)部分對應(yīng)的字符串與小數(shù)部分對應(yīng)的字符串進行合并即可。比如待轉(zhuǎn)換的數(shù)字是450210.35,取出整數(shù)部分為450210,根據(jù)整數(shù)部分的轉(zhuǎn)換規(guī)則得“肆拾伍萬零貳佰壹拾圓”,小數(shù)部分為35,根據(jù)小數(shù)部分的轉(zhuǎn)換規(guī)則得“叁角伍分”,合并后的轉(zhuǎn)換結(jié)果為“肆拾伍萬零貳佰壹拾圓叁角伍分”。
金額轉(zhuǎn)換算法對應(yīng)的N-S流程圖如圖1所示,其中圖a為算法的總體流程圖,圖b為小數(shù)部分轉(zhuǎn)換
圖1 金額轉(zhuǎn)換算法流程圖
字典[4]是Python中的一種數(shù)據(jù)類型,是一種可變?nèi)萜髂P?,且可存儲任意類型對象。字典類型可以理解為一種映射關(guān)系,映射是一種鍵和值的對應(yīng)關(guān)系,比如1:“壹”,鍵“1”對應(yīng)的值是“壹”。字典就是鍵值對的集合,通過鍵獲得對應(yīng)的值。Python中字典的聲明,以及通過鍵獲得值的方式如下。
例如,下面定義了一個字典,字典dictArab2Chinese定義了阿拉伯數(shù)字和大寫漢字的映射關(guān)系。
有了這個字典要把3 2 1 轉(zhuǎn)換成對應(yīng)的漢字形式,只需要分別取鍵3、2、1 對應(yīng)的值“叁”“貳”“壹”,然后連接成一個字符串即可,結(jié)果為“叁貳壹”。下面的算法中就巧妙地使用了字典將阿拉伯數(shù)字轉(zhuǎn)換成對應(yīng)的漢字并在后面加上數(shù)字所在位對應(yīng)的單位來實現(xiàn)大寫金額的轉(zhuǎn)換。
函數(shù)名稱:Arab2Chinese。
參數(shù):totalPrice數(shù)值類型,待轉(zhuǎn)換的金額。
返回值:result字符串類型,符合漢語書寫規(guī)范的大寫金額。
函數(shù)的定義如下:
上述代碼把待轉(zhuǎn)換的數(shù)字450210.35轉(zhuǎn)換為對應(yīng)的大寫金額并輸出,輸出結(jié)果為“肆拾伍萬零貳佰壹拾圓叁角伍分”。
本文采用Python實現(xiàn)的基于字典的大寫金額轉(zhuǎn)換算法簡單易懂。文中定義的轉(zhuǎn)換函數(shù)Arab2Chinese能實現(xiàn)千億以內(nèi)的阿拉伯數(shù)字到大寫金額的轉(zhuǎn)換,能滿足大多數(shù)情況下金額轉(zhuǎn)換的需求。如果待轉(zhuǎn)換的阿拉伯數(shù)字超出仟億位,只需要修改函數(shù)體中第二行定義的數(shù)位字典dictUnit2Chinese,在字典中增加更高數(shù)位的鍵值對即可,比如修改為dictUnit2Chinese={0:u'',1:u'拾',2:u'佰',3:u'仟',4:u'',5:u'拾',6:u'佰',7:u'仟',8:u'',9:u'拾',10:u'佰',11:u'仟',12:u’萬’},該算法就能實現(xiàn)萬億以內(nèi)的金額轉(zhuǎn)換,該算法具有很好的可擴充性和通用性。