用VFP快速转换数字为大写汉字
软件世界
问题
从事财务工作的朋友肯定有过这样的体会:很多金额都是以阿拉伯数字的形式输入的,打印时却需要用大写汉字数字的形式,很多朋友这时只好不辞辛苦地重新输入。其实不必,笔者使用VFP成功实现了两种数字形式之间的转换。
分析
要实现转换功能,有两个需要注意的问题:一是在输入数字后首先检查输入的是不是合法的阿拉伯数字,如果不是阿拉伯数字则不进行转换。二是在确定所输入的内容是阿拉伯数字以后,要根据数字的位数和大小确定大写汉字数字的写法。
另外,处理的数值范围要尽量大,比如本例中能处理的数值范围在正负万亿以内。
代码
由于整个程序的代码很多,所以笔者这里只给出关键转换函数的代码,完整的代码请到http://www.cpcw.com/19/daxiaoxiezhuanhuan.txt下载。这些代码在VFP6、VFP7和VFP8中运行通过。为了突出重点,笔者没有设计复杂的界面,而且将界面设计部分也以代码的形式给出,朋友们只要在VFP的命令窗口中运行包含以下代码的PRG即可。
*- 功能:将阿拉伯数字转化成大写汉字数字
FUNCTION Number2Chinese(tnNum As Double) As String
*- 大写汉字字符串
LOCAL lcChinese As String
LOCAL lnNum As Number
LOCAL i As Integer
lnNum = ROUND(ABS(tnNum)*100 ,0)
*- 处理数值的范围是正负万亿以内
IF LEN(TRANSFORM(lnNum)) > LENC(CHI NESE_UNIT)
MESSAGEBOX("超出计算范围 ,整数部分只允许" + LTRIM(STR(LEN(CHINESE_UNIT)/2 - 2)) + "位" ,"错误")
RETURN ""
ENDIF
lcChinese = IIF(tnNum < 0 ,"负" ,"")
FOR m.i = LEN(ALLTRIM(STR(lnNum ,15))) - 1 TO 0 STEP -1
lcChinese = lcChinese + SUBSTR(CHI NESE_NUMBER ,;
INT(ROUND(lnNum/10^m.i ,10))*2 + 1;,2)
lcChinese = lcChinese + SUBSTR(CHINESE_ UNIT ,m.i *2 + 1 ,2)
lnNum = MOD(lnNum ,10^m.i )
ENDFOR
lcChinese = STRTRAN(lcChinese ,"零仟" ,"零")
lcChinese = STRTRAN(lcChinese ,"零佰" ,"零")
lcChinese = STRTRAN(lcChinese ,"零拾" ,"零")
lcChinese = STRTRAN(lcChinese ,"零角" ,"零")
lcChinese = STRTRAN(lcChinese ,"零分" ,"整")
lcChinese = STRTRAN(lcChinese ,"零零" ,"零")
lcChinese = STRTRAN(lcChinese ,"零零" ,"零")
lcChinese = STRTRAN(lcChinese ,"零亿" ,"亿")
lcChinese = STRTRAN(lcChinese ,"零万" ,"万")
lcChinese = STRTRAN(lcChinese ,"零元" ,"元")
IF lcChinese = "整"
lcChinese = "零元整"
ELSE
lcChinese = STRTRAN(lcChinese ,"亿万" ,"亿")
lcChinese = STRTRAN(lcChinese ,"零整" ,"整")
ENDIF
RETURN lcChinese
ENDFUNC
效果
程序运行的效果如图所示。在“货币数字”框中输入数字后,“货币大写”框中立即显示转换结果。
朋友们可以把关键功能的实现方法移植到更复杂的应用中去,比如某个资料录入系统,定能大幅提高录入效率。
