主题:小写转大写的问题?
笨兔
[专家分:300] 发布于 2009-03-12 05:45:00
我在网上搜索下,搜到别人的源代码:
FUNCTION rmbupper()
lParameters mmje &&输入变量:数字型,小于9万亿,大于-9万亿
Private dx,aa,i
dx=Iif(mmje<0,'负','')
aa=Round(Abs(mmje)*100,0)
For i=Len(Alltrim(Str(aa,15)))-1 To 0 Step -1
dx=dx+Subs('零壹贰叁肆伍陆柒捌玖',Int(Round(aa/10^i,10))*2+1,2)+Subs('分角元拾佰仟万拾佰仟亿拾佰仟万',i*2+1,2)
aa=Mod(aa,10^i)
Endf
dx=Strtran(Strtran(Strtran(Strtran(Strtran(dx,'零仟','零'),'零佰','零'),'零拾','零'),'零角','零'),'零分','整')
dx=Strtran(Strtran(Strtran(Strtran(Strtran(dx,'零零','零'),'零零','零'),'零亿','亿'),'零万','万'),'零元','元')
Return Iif(dx='整','零元整',Strtran(Strtran(dx,'亿万','亿'),'零整','整'))
ENDFUNC
经测试存在问题.请各位老师帮助改一下或给一个测试好的,这里谢了
回复列表 (共5个回复)
沙发
北京惬意 [专家分:1330] 发布于 2009-03-12 07:11:00
下面是本人在本网收集的三个小写转大写的程序,其中有一个觉得非常好,但记不得是哪一个了,你自己逐个试试选用好了。
但先声明我哪个都没用,因为我自己在这之前编了一个,虽然看起来没有这三个简捷,但运行速度快,应用多年没出问题,加之还是自己的东西,当然不必改了吧?
* ================
* 小写转大写之一
FUNCTION VERTHZY
PARAMETERS ZJES
PUBLIC CHHH,DHHH
CHHH='壹贰叁肆伍陆柒捌玖'
DHHH='拾万仟佰拾元'
MD12=''
FOR I=1 TO 6
MD12=MD12+IIF(VAL(SUBSTR(LEFT(STR(ZJES,9,2),6),I,1))=0,'零',SUBSTR(CHHH,2*VAL(SUBSTR(LEFT(STR(ZJES,9,2),6),I,1))-1,2))+SUBSTR(DHHH,2*I-1,2)
ENDFOR
IF INT(ZJES)<>ZJES
MD12=MD12+IIF( VAL(LEFT(RIGHT(STR(ZJES,11,2),2),1))=0,'零',SUBSTR(CHHH,2*VAL(LEFT(RIGHT(STR(ZJES,11,2),2),1))-1,2))+'角'+;
IIF(VAL(RIGHT(RIGHT(STR(ZJES,11,2),2),1))=0,'零',SUBSTR(CHHH,2*VAL(RIGHT(RIGHT(STR(ZJES,11,2),2),1))-1,2))+'分'
ENDIF
MPD22=MD12+'整'
RETU MPD22
* ================
* 小写转大写之二
FUNCTION VERTHZY
PARAMETERS X &&传递人民币金额的小写数值
X= INT(X*100) &&使个位数为“分”
IF X<=0 &&有效性判断
RETURN
ENDIF
STRING1="分角元拾佰仟万拾佰仟亿拾佰" &&量词
STRING2='零壹贰叁肆伍陆柒捌玖' &&数词
N=INT(LOG(X)/LOG(10))+1 &&求金额位数
X=ALLTRIM(STR(X,13)) &&将金额转化为字符型
HZY='' &&用于存放人民币大写形式
FOR I=1 TO N
Y=SUBS(X,N+1-I,1)
UNI =SUBS(STRING1,I*2-1,2) &&求量词
NUM=SUBS(STRING2,VAL(Y)*2+1,2) &&求数词
IF NUM='零'
UNI=IIF(UNI='元'.OR.UNI='万'.OR.UNI='亿',UNI,'')
ENDIF
HZY=NUM+UNI+HZY
ENDFOR
DO WHILE '零零'$HZY.OR.'零元'$HZY.OR.'零万'$HZY;
.OR.'零亿'$HZY.OR.'亿万'$HZY
HZY=STRT(STRT(STRT(STRT(STRT(HZY,'零元','元零'),'零万',;
'万零'),'零亿','亿零'),'亿万','亿零'),'零零','零')
ENDDO &&现实算法4
HZY=IIF(LEFT(HZY,4)='壹拾',SUBS(HZY,3),HZY)
HZY=LEFT(HZY,LEN(HZY)-2)+STRT(RIGH(HZY,2), '零', '整')
RETURN HZY &&返回结果,程序结束.
* ================
* 小写转大写之三
PARAMETERS RMB
XX=LTRIM(STR(RMB,11,2)) &&数值转换字符
RMBLEN=LEN(XX) &&字符长度赋予rmblen
DX='零'
C1='零壹贰叁肆伍陆柒捌玖'
C2='分角 元拾佰仟万拾佰仟'
*********----------------
DO WHILE RMB>0 AND RMBLEN>=1
DB=SUBSTR(XX,LEN(XX)-RMBLEN+1,1) &&截取字符
IF DB<>'.'
DX1=SUBS(C1,VAL(DB)*2+1,2) &&转换大写数字
DX2=TRIM(SUBS(C2,(RMBLEN-1)*2+1,2)) &&定位
IF DX1='零'
HZ=SUBS(DX,LEN(DX)-1,2)
IF HZ='零'
IF DX2='万'.OR.DX2='元'
DX=SUBS(DX,1,LEN(DX)-2)+DX2
ENDI
ELSE
IF DX2='万'.OR.DX2='元'
DX=SUBS(DX,1,LEN(DX))+DX2
ELSE
DX=DX+DX1
ENDIF
ENDIF
ELSE
DX=DX+DX1+DX2
ENDIF
ENDIF
RMBLEN=RMBLEN-1
ENDDO
IF SUBS(DX,1,2)='元'
DX=SUBS(DX,3,LEN(DX)-2)
ENDI
IF SUBS(DX,1,2)='零'
DX=SUBS(DX,3,LEN(DX)-2)
ENDI
IF SUBS(DX,LEN(DX)-1,2)='零'
DX=SUBS(DX,1,LEN(DX)-2)+'整'
ENDI
RETU DX
板凳
qjbzjp [专家分:8830] 发布于 2009-03-12 09:53:00
也是网上下载的资料,简单试过,还行。
?dx(123)
FUNCTION DX
PARAMETERS nAmount
PRIVATE ALL LIKE L_*
L_S1='零壹贰叁肆伍陆柒捌玖'
L_S2='亿仟佰拾万仟佰拾亿仟佰拾万仟佰拾元角分'
nAmount=LTRIM(STR(nAmount*100,LEN(L_S2)/2))
L_LEN=LEN(nAmount)
L_SS2=RIGH(L_S2,2*L_LEN)
L_DX=''
L_0JS=0 &&连续零的个数
L_N=0
DO WHILE L_N<L_LEN
L_N=L_N+1
L_SZ=SUBSTR(nAmount,L_N,1)
L_SZ=SUBSTR(L_S1,2*VAL(L_SZ)+1,2)
L_DW=SUBSTR(L_SS2,2*L_N-1,2)
IF L_SZ='零'
L_SZ=''
DO CASE
CASE L_DW$'亿元'
CASE L_DW='万'
IF RIGH(L_DX,2)='亿'
L_DW=''
ENDIF
OTHERWISE
L_DW=''
ENDCASE
L_0JS=L_0JS+1
ELSE
IF L_0JS>0
L_SZ='零'+L_SZ
ENDIF
L_0JS=0
ENDIF
L_DX=L_DX+L_SZ+L_DW
ENDDO
L_DX=L_DX+IIF(RIGH(nAmount,1)='0','整','')
RETURN L_DX
ENDFUNC
3 楼
笨兔 [专家分:300] 发布于 2009-03-20 19:36:00
经测试1楼的三个程序都有问题.
2楼的可以,但运行时提示一错误文件,函数结果还是对的.
4 楼
北京惬意 [专家分:1330] 发布于 2009-03-20 20:23:00
我是1楼,
经测试三个程序都有问题我觉得不会,
否则你给了我30分觉得受之有愧。
那是当时对小写转大写非常有研究的几位写的,
我一是觉得珍贵、二是对他们崇拜才收藏的。
5 楼
笨兔 [专家分:300] 发布于 2009-03-21 06:11:00
谢谢你:
我测试1,没有问题.因为我粗心我没有看清.
2我测试确实有问题,提示".OR.'零亿'$HZY.OR.'亿万'$HZY"有不能识别的谓语.
3提示数据类型不匹配
我来回复