娄七明,许海成,孙建洪
(红河学院工学院,云南蒙自 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’万’},该算法就能实现万亿以内的金额转换,该算法具有很好的可扩充性和通用性。