用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

  效果

  程序运行的效果如图所示。在“货币数字”框中输入数字后,“货币大写”框中立即显示转换结果。

  朋友们可以把关键功能的实现方法移植到更复杂的应用中去,比如某个资料录入系统,定能大幅提高录入效率。