基于类的大写金额转换在C#中的实现

2020-05-07 02:36:32娄七明杨志金孙建洪张红伟
红河学院学报 2020年2期
关键词:字符串阿拉伯数字大写

娄七明,杨志金,孙建洪,张红伟

(红河学院工学院,云南蒙自 661100)

1 引言

随着信息化建设的不断推进,办公自动化程度的不断提高,很多票据和经济合同等都需要打印。在这些票据和经济合同中通常需要打印大写金额,这就需要将用阿拉伯数字书写的金额转换成人民币大写形式。在财务管理中大写金额不能随意书写,[3]必须遵循一定的规则。目前有使用各种语言实现的大写金额转换函数,但这些函数都是采用面向过程的设计思想实现的,且算法比较复杂,可读性较差。因此,本文采用面向对象的程序设计思想来实现大写金额转换,并用C#实现该算法。该算法把待转换的数字和转换方法封装为一个整体,具有可重用性强、可扩充性好、算法简单易懂等特点。

2 算法分析

2.1 大写金额相关规则[1-2]

用阿拉伯数字书写的金额转换成大写金额应遵循以下规则:

(1)阿拉伯数字转换为大写金额后,如果没有角分位,应在“元”后写“整”(或“正”),否则“角”和“分”后面不写“整”(或“正”)字。

(2)把非0的阿拉伯数字转换成对应的大写数字,并加上相应数位对应的汉字,如10转换为“壹拾元”。

(3)在亿级以上有不为零的数字时,亿位要加“亿”;在万和千万之间有不为零的数字时,万位要加“万”;金额大于一元时,个位要加“元”,如1010000100,转换为“壹拾亿零壹仟万零壹佰元”。

(4)如果非0的阿拉伯数字之间有一个0或者多个0时,大写金额中间对应处要加一个“零”;如果非0的阿拉伯数字之后所有数字都为0,则大写金额中这个数字后面不加“零”,如10100,转换为“壹万零壹佰元”。

2.2 算法分析

要将一个阿拉伯数字转换为大写金额,如100202001023.35。可以按如下步骤实现。

第一步:把该数字分成整数部分和小数部分,整数部分是100202001023,小数部分是35。

第二步:分别将小数部分和整数部分进行转换,小数部分取出角位的数字和分位的数字分别转换,本例中角位转换为“叁角”,分位转换为“伍分”。整数部分也取出各位对应的值分别转换成对应的字符串,本例中从千亿位到个位分别转换为“壹仟”“零”“零”“贰亿”“零”“贰佰”“零”“万”“壹仟”“零”“贰拾”“叁元”。

第三步:把前面的转换结果合并成一个字符串,即“壹仟零零贰亿零贰佰零万壹仟零贰拾叁元叁角伍分”。

第四步:消除合并后所得字符串中多余的字符,如连续的多个“零”,只保留一个“零”,把字符串中的“零亿”“零万”“零元”等分别替换成“亿”“万”“元”,删除字符串最前面的“亿”“元”“零”以及字符串最后面的“零”。本例处理完成后结果,即“壹仟零贰亿零贰佰万壹仟零贰拾叁元叁角伍分”。

第五步:判断是否在字符串的最后面加上“正”字,整个转换过程即完成。

综上,大写金额转换算法可以用如图1所示的N-S流程图表示。

图1 大写金额转换算法N-S流程图

3 算法实现[1-2]

3.1 类的定义

定义类ArabToChinese实现用阿拉伯数字书写的金额到大写金额的转换,类的成员数据和成员方法如下:

3.2 类的实现

3.2.1 构造函数的实现

构造函数ArabToChinese的功能是将待转换的金额s转换为double类型,并取出各位对应的数字赋值给相应的成员数据,实现代码如下:

3.2.2 方法DtoC的实现

方法DtoC的功能是将非零的数字转换成对应的汉字,对应的代码如下:

3.2.3 将各位数字转换成对应字符串

分别定义方法将各位数字转换为对应的字符串,因篇幅所限,且这些方法的实现代码类似,这里以方法FentoS、JiaotoS、GeweitoS的实现为例进行介绍,这三个方法对应的代码如下:

3.2.4 GetResult方法的实现

GetResult方法的功能是合并各部分的转换结果,并删除多余的字符,得到最终的转换结果,实现该方法的代码如下:

3.3 应用举例

下面通过实例说明转换方法的使用。如要把101012000100.00转换为大写金额,则以字符串“101012000100.00”为参数创建对象,然后通过对象调用成员方法GetResult获得转换结果。在C#控制台应用程序中的实现代码如下:

程序的输出结果是“壹仟零壹拾亿壹仟贰佰万零壹佰元正”。

4.结语

本文运用面向对象的程序设计思想,把要转换的金额和转换算法封装为一个整体,并用C#实现了该算法。文中定义的类ArabToChinese能实现整数部分12位(即千亿位)和小数部分2位的数字大写金额转换,能满足大多数情况下金额转换的需求。文中基于类实现的金额转换方法具有良好的可扩充性,若需要转换更大范围的金额,可以从类ArabToChinese派生出新的类,并在新的类中增加相应的成员数据及相应位的转换方法即可实现。

猜你喜欢
字符串阿拉伯数字大写
做一个大写的“我”
少先队活动(2022年4期)2022-06-06 07:20:20
大写的厉害:“00后”少年自制火箭成功上天
小读者(2021年4期)2021-06-11 05:42:04
阿拉伯数字的用法
“大写”与“大些”
找影子
阿拉伯数字是阿拉伯人发明的吗
—个大写的pink 该入手的都来了
Coco薇(2016年2期)2016-03-22 02:31:03
一种新的基于对称性的字符串相似性处理算法
印度人发明的阿拉伯数字
智慧与创想(2013年6期)2013-08-27 01:38:48
依据字符串匹配的中文分词模型研究