婁七明,楊志金,孫建洪,張紅偉
(紅河學院工學院,云南蒙自 661100)
隨著信息化建設的不斷推進,辦公自動化程度的不斷提高,很多票據和經濟合同等都需要打印。在這些票據和經濟合同中通常需要打印大寫金額,這就需要將用阿拉伯數字書寫的金額轉換成人民幣大寫形式。在財務管理中大寫金額不能隨意書寫,[3]必須遵循一定的規則。目前有使用各種語言實現的大寫金額轉換函數,但這些函數都是采用面向過程的設計思想實現的,且算法比較復雜,可讀性較差。因此,本文采用面向對象的程序設計思想來實現大寫金額轉換,并用C#實現該算法。該算法把待轉換的數字和轉換方法封裝為一個整體,具有可重用性強、可擴充性好、算法簡單易懂等特點。
用阿拉伯數字書寫的金額轉換成大寫金額應遵循以下規則:
(1)阿拉伯數字轉換為大寫金額后,如果沒有角分位,應在“元”后寫“整”(或“正”),否則“角”和“分”后面不寫“整”(或“正”)字。
(2)把非0的阿拉伯數字轉換成對應的大寫數字,并加上相應數位對應的漢字,如10轉換為“壹拾元”。
(3)在億級以上有不為零的數字時,億位要加“億”;在萬和千萬之間有不為零的數字時,萬位要加“萬”;金額大于一元時,個位要加“元”,如1010000100,轉換為“壹拾億零壹仟萬零壹佰元”。
(4)如果非0的阿拉伯數字之間有一個0或者多個0時,大寫金額中間對應處要加一個“零”;如果非0的阿拉伯數字之后所有數字都為0,則大寫金額中這個數字后面不加“零”,如10100,轉換為“壹萬零壹佰元”。
要將一個阿拉伯數字轉換為大寫金額,如100202001023.35。可以按如下步驟實現。
第一步:把該數字分成整數部分和小數部分,整數部分是100202001023,小數部分是35。
第二步:分別將小數部分和整數部分進行轉換,小數部分取出角位的數字和分位的數字分別轉換,本例中角位轉換為“叁角”,分位轉換為“伍分”。整數部分也取出各位對應的值分別轉換成對應的字符串,本例中從千億位到個位分別轉換為“壹仟”“零”“零”“貳億”“零”“貳佰”“零”“萬”“壹仟”“零”“貳拾”“叁元”。
第三步:把前面的轉換結果合并成一個字符串,即“壹仟零零貳億零貳佰零萬壹仟零貳拾叁元叁角伍分”。
第四步:消除合并后所得字符串中多余的字符,如連續的多個“零”,只保留一個“零”,把字符串中的“零億”“零萬”“零元”等分別替換成“億”“萬”“元”,刪除字符串最前面的“億”“元”“零”以及字符串最后面的“零”。本例處理完成后結果,即“壹仟零貳億零貳佰萬壹仟零貳拾叁元叁角伍分”。
第五步:判斷是否在字符串的最后面加上“正”字,整個轉換過程即完成。
綜上,大寫金額轉換算法可以用如圖1所示的N-S流程圖表示。

圖1 大寫金額轉換算法N-S流程圖
定義類ArabToChinese實現用阿拉伯數字書寫的金額到大寫金額的轉換,類的成員數據和成員方法如下:

3.2.1 構造函數的實現
構造函數ArabToChinese的功能是將待轉換的金額s轉換為double類型,并取出各位對應的數字賦值給相應的成員數據,實現代碼如下:


3.2.2 方法DtoC的實現
方法DtoC的功能是將非零的數字轉換成對應的漢字,對應的代碼如下:

3.2.3 將各位數字轉換成對應字符串
分別定義方法將各位數字轉換為對應的字符串,因篇幅所限,且這些方法的實現代碼類似,這里以方法FentoS、JiaotoS、GeweitoS的實現為例進行介紹,這三個方法對應的代碼如下:

3.2.4 GetResult方法的實現
GetResult方法的功能是合并各部分的轉換結果,并刪除多余的字符,得到最終的轉換結果,實現該方法的代碼如下:


下面通過實例說明轉換方法的使用。如要把101012000100.00轉換為大寫金額,則以字符串“101012000100.00”為參數創建對象,然后通過對象調用成員方法GetResult獲得轉換結果。在C#控制臺應用程序中的實現代碼如下:

程序的輸出結果是“壹仟零壹拾億壹仟貳佰萬零壹佰元正”。
本文運用面向對象的程序設計思想,把要轉換的金額和轉換算法封裝為一個整體,并用C#實現了該算法。文中定義的類ArabToChinese能實現整數部分12位(即千億位)和小數部分2位的數字大寫金額轉換,能滿足大多數情況下金額轉換的需求。文中基于類實現的金額轉換方法具有良好的可擴充性,若需要轉換更大范圍的金額,可以從類ArabToChinese派生出新的類,并在新的類中增加相應的成員數據及相應位的轉換方法即可實現。