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