免费下载应用软件、交流使用经验。

软件下载 经验交流 软件开发 专题论述 请君留言 网站介绍 休闲时光 返回主页
 
转换大写金额

作者:本人     来源:本站

    最近单位上需要打印一批领款单,其中金额必需大写打印,我义不容辞地接受了这个任务。我开始想这不过是小菜一碟,可真正做起来才发现问题不是那么简单,现将经过写在下面。
    我是用VFP代码来编程的,解决的思路是先将数值型金额转换为字符串,找出小数点位置,然后分别将小数部份和整数部份依次取出相应的位进行转换,程序代码如下: 
程序1:
jec=alltr(str(金额))          &&字段"金额"为数值型,通过这两个函数转换为无空格的字符型
ws=len(jec)                   &&计算长度
sz='零壹贰叁肆伍陆柒捌玖拾'    &&汉字数字
dw0='元拾佰仟万拾佰仟亿拾佰仟' &&汉字单位
dw1='分角'
w0=at(jec,'.')                &&求出小数点位置
jec1=subs(jec,w0+1,ws-w0)     &&取出小数点以后的字符
jec0=left(jec,w0-1)           &&取出小数点以前的字符
jed=''                        &&变量jed为大写金额
for i=1 to ws-w0              &&转换小数部份
s1=val(subs(jec1,ws-w0-i,1))  &&取出当前位
jed=subs(sz,s1*2+1,2)+subs(dw1,i*2-1,2)+jed
endfor
for i=1 to w0-1               &&转换整数部份
s1=val(subs(jec0,w0-1-i,1))   &&取出当前位
jed=subs(sz,s1*2+1,2)+subs(dw1,i*2-1,2)+jed
endfor
repl 大写 with jed            &&将大写金额赋予字段"大写"

    上面的代码运行后,并未达到预期的效果,转换的仅有角和分,而且还不正确。经分析测试原来是str()函数不能转换小数部份,而且自动将小数部份四舍五入成整数后再进行转换。找到原因后,随即将解题思路改为先进行小数和整数分离,然后分别进行转换,修改后的程序如下:


程序2:
je0=int(金额)                &&取整数部份
je1=je-je0                   &&取小数部份
je1=je1*100                  &&将小数变为两位整数
jec=alltr(str(je0))          &&将整数部份由数值型转换为字符型
ws=len(jec)                  &&计算整数部份长度
sz='零壹贰叁肆伍陆柒捌玖拾'    &&汉字数字
dw='元拾佰仟万拾佰仟亿拾佰仟'  &&汉字单位
jed=subs(sz,int(je1/10)*2+1,2)+'角'+subs(sz,(je1-int(je1/10)*10)*2+1,2)+'分'
for i=1 to ws                &&转换整数部份
s1=val(subs(jec,ws-i+1,1))   &&取出当前位
jed=subs(sz,s1*2+1,2)+subs(dw,i*2-1,2)+jed
endfor
repl 大写 with jed           &&将大写金额赋予字段"大写"

    经过修改后的程序2基本可以正确地进行转换,但转换后的大写金额还不符合常用的格式,如101005.06元被转换为“壹拾零万壹仟零佰零拾伍元零角陆分”,而习惯上应为“壹拾万壹仟零伍元零陆分”。针对这个情况,我又将程序2修改为程序3:

程序3:
je0=int(金额)                &&取整数部份
je1=金额-je0                 &&取小数部份
je1=je1*100                  &&将小数变为两位整数
jec=alltr(str(je0))          &&将整数部份由数值型转换为字符型
ws=len(jec)                  &&计算整数部份长度
sz='零壹贰叁肆伍陆柒捌玖拾'   &&汉字数字
dw='元拾佰仟万拾佰仟亿拾佰仟' &&汉字单位
if je1>0                    &&进行小数部份转换
if je1>9                    &&角位不为零
jed=subs(sz,int(je1/10)*2+1,2)+'角'
else                        &&角位为零
jed='零'
endif
je1=je1-int(je1/10)*10      &&计算分位
if je1>0 &&分大于零
jed=jed+subs(sz,je1*2+1,2)+'分'
else
jed=jed+'整'
endif
else
jed='整'                    &&角分位为零
endif
w0=.t.                      &&判断是否有连续零时使用
for i=1 to ws               &&转换整数部份
s1=val(subs(jec,ws-i+1,1))  &&取出当前位
if s1=0                     &&本位为零
if w0                       &&非连续零
jed='零'+jed
w0=.f.                      &&置已经有一个零标志
endif
else                        &&本位不为零
jed=subs(sz,s1*2+1,2)+subs(dw,i*2-1,2)+jed
w0=.t.                      &&置非零标志
endif
endfor
repl 大写 with jed          &&将大写金额赋予字段"大写"

    这个程序的转换结果基本符合人们的语言习惯了,但还是有些问题,如101005.06元被转换为“壹拾零壹仟零伍元零陆分”,与“壹拾万壹仟零伍元零陆分”的习惯写法不一致。仔细分析了一下,发现我们习惯读法中“元”、“万”、“亿”是必须有的,若是此位为零,则不需要出现字符“零”。程序进一步修改如下:

程序4:
je0=int(金额)               &&取整数部份
je1=金额-je0                &&取小数部份
je1=je1*100                 &&将小数变为两位整数
jec=alltr(str(je0))         &&将整数部份由数值型转换为字符型
ws=len(jec)                 &&计算整数部份长度
sz='零壹贰叁肆伍陆柒捌玖拾'   &&汉字数字
dw='元拾佰仟万拾佰仟亿拾佰仟' &&汉字单位
if je1>0                    &&进行小数部份转换
if je1>9                    &&角位不为零
jed=subs(sz,int(je1/10)*2+1,2)+'角'
else                        &&角位为零
jed='零'
endif
je1=je1-int(je1/10)*10      &&计算分位
if je1>0                    &&分大于零
jed=jed+subs(sz,je1*2+1,2)+'分'
else
jed=jed+'整'
endif
else
jed='整'                    &&角分位为零
endif
w0=.t.                      &&判断是否有连续零时使用
for i=1 to ws               &&转换整数部份
s1=val(subs(jec,ws-i+1,1))  &&取出当前位
if s1=0                     &&本位为零
if i=1.or.i=5.or.i=9        &&在元、万、亿位上
jed=subs(dw,i*2-1,2)+jed    &&加单位、不加零
else
if w0                       &&非连续零
jed='零'+jed                &&加零不加单位
endif
endif
w0=.f.                      &&置已经有一个零标志
else                        &&本位不为零
jed=subs(sz,s1*2+1,2)+subs(dw,i*2-1,2)+jed
w0=.t.                      &&置非零标志
endif
endfor
repl 大写 with jed          &&将大写金额赋予字段"大写"

    至此,程序调试就基本通过了。为什么说是基本通过呢?因为这个程序仅能对10亿元以下(9位整数)正确地进行转换,金额在10亿元以上时转换出来又是不正确的了。经测试分析这是由于VFP中数值变量的精度问题,(我用的是单精度变量),不过因为我目前需要打印的金额远不到10亿元,这个程序完全可以满足我的需要,所以也就此罢休了。

注:

发表日期:2001-1-7     修改日期:

备案序号:赣ICP备05002359号

建议使用1024*768分辩率浏览 ☆版权所有 摘抄或转载须得到书面许可☆ Hujiajun ©1999,2016
E-Mail: hu-jj@21cn.com