回 帖 发 新 帖 刷新版面

主题:小写转大写的问题?

我在网上搜索下,搜到别人的源代码:
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个回复)

沙发

下面是本人在本网收集的三个小写转大写的程序,其中有一个觉得非常好,但记不得是哪一个了,你自己逐个试试选用好了。
但先声明我哪个都没用,因为我自己在这之前编了一个,虽然看起来没有这三个简捷,但运行速度快,应用多年没出问题,加之还是自己的东西,当然不必改了吧?

* ================
* 小写转大写之一
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

板凳

也是网上下载的资料,简单试过,还行。

?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 楼

经测试1楼的三个程序都有问题.
2楼的可以,但运行时提示一错误文件,函数结果还是对的.

4 楼

我是1楼,
经测试三个程序都有问题我觉得不会,
否则你给了我30分觉得受之有愧。
那是当时对小写转大写非常有研究的几位写的,
我一是觉得珍贵、二是对他们崇拜才收藏的。

5 楼

谢谢你:
我测试1,没有问题.因为我粗心我没有看清.
2我测试确实有问题,提示".OR.'零亿'$HZY.OR.'亿万'$HZY"有不能识别的谓语.
3提示数据类型不匹配

我来回复

您尚未登录,请登录后再回复。点此登录或注册