将小写数字转换为中文大写是实际工作经常遇到的问题,相对于手工而言,编程的思路要省事得多,现将用Visual FoxPro(以下简称VFP)编写的程序整理出来,供大家参考。
1.需求分析
在财务票据中,我们要将小写金额转换为中文大写金额,一般的要求是将给定的阿拉伯数字的金额转换成“×万×仟×佰×拾×元×角×分”的格式。
编程转换大写金额总会有上限和下限,必须根据实际使用时金额可能出现的范围来确定这个上下限,否则就有可能在应用时金额的大小超出程序转换允许的范围,而导致程序出错。在程序中还应该先对被转换的小写金额进行判断,超出范围的不予转换,以免程序出错。
2.编程思路
将程序写成函数LowToUpp(n),参数n就是要转换的数值型的小写金额,返回值是转换成中文大写金额的字符串。需要时调用该函数,完成小写金额到中文大写金额的转换。
将大写数字按“零壹贰叁肆伍陆柒捌玖”的顺序放在字符串变量c1中,每个数字k的值与对应汉字的起始字节位置的关系为2k+1。先将小写金额转换成字符串,通过循环逐个取出小写数字,根据其数值k,用SUBSTR( )函数取出相应位置上的大写数字。
如果从后向前逐个转换小写金额字符串中的数字,金额的单位顺序则是“分角元拾佰仟万”。所以将单位按此顺序存放在字符串变量c2中,每个小写金额数字的单位起始字节位置与其倒数的位置m(也是循环次数)的对应关系为(m-1)×2+1。使用时只要根据循环次数,用SUBSTR( )函数在对应的位置上取出单位,添加在转换好的大写数字后面即可。这样也就免去了从前向后转换小写金额字符串时,要根据位数判断使用什么单位的麻烦。
3.解决方案
以VFP编写的转换函数代码如下:
FUNCTION LowToUpp
LPARAMETERS n &&函数接收的参数(要转换的小写金额)
IF n<0 OR n>=1000000000
RETURN " " &&参数值超出范围,函数返回空串
ENDIF
c1 = "零壹贰叁肆伍陆柒捌玖"
c2 = "分角元拾佰仟万拾佰仟亿"
cn = ALLTRIM(STR(n, 12, 2)) &&将数值型小写金额转换为字符串
cs = " " &&转换后的大写金额(函数返回值)
m = 1
FOR i=LEN(cn) TO 1 STEP -1
k = SUBSTR(cn, i, 1) &&取出当前要转换的小写数字
IF k <> "."
cs = SUBS(c1,val(k)*2+1,2)+SUBS(c2,(m-1)*2+1,2)+" "+cs
m = m + 1
ENDIF
ENDFOR
RETURN cs
ENDFUNC
为了方便引用,这里小写金额转换的范围限制为大于等于0,小于10亿。
4.使用方法
此函数的调用方法如下:
WAIT LowToUpp(342016) WINDOW
n = 847856.45
s = LowToUpp(n)
WAIT s WINDOW
调用此函数时必须要有数值型的参数,否则会出错。如果调用此函数的代码与该函数代码不在一个程序文件中,可能会出现“lowtoupp.prg不存在”的错误信息。使用SET PROCEDURE TO命令打开包含有LowToUpp函数的程序文件,命令格式如下:
SET PROCEDURE TO d:\程序1.prg ADDITIVE
其中“d:\程序1.prg”为包含LowToUpp函数的程序文件名和路径,“ADDITIVE”指定不关闭已打开的程序文件。
以上源代码在任意VFP版本中都可以正常运行。使用VFP来示例,主要是因为它是最容易上手的桌面数据库管理系统,可以方便未学习过编程的朋友参考。其它编程语言只要对相关命令、函数稍做修改就可以使用。
|