娄七明,杨志金,孙建洪,张红伟
(红河学院工学院,云南蒙自 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派生出新的类,并在新的类中增加相应的成员数据及相应位的转换方法即可实现。