回 帖 发 新 帖 刷新版面

主题:[原创]疯狂的VFPER之数值转换为金额大写

一晃真正用VFP写程序也已6年多了,大大小小也做了几十个系统,曾经有多少个日夜坐在电脑前敲打着空格、回车...,突然发现我在论坛上回贴的多,发贴的少,决定痛改前非:)...闲话少说,言归正传,我会陆续将我的部份VFP代码给大家分享(并不一定都是我的原创,有些是在其他VFPER的代码上改的)。

疯狂的VFPER之数值转换为金额大写

将以下代码存为RMB.prg,在其它地方调用,如?RMB(123.45)。
Lparameters tnMoney
Private lcMoney,lnMoney,i,lcReturnValue
Local lcMoney,lnMoney,i,lcReturnValue

lcMoney = Iif(tnMoney<0,"负","")
lnMoney = Round(Abs(tnMoney)*100,0)
For i = Len(Alltrim(Str(lnMoney,15)))-1 To 0 Step -1
   lcMoney = lcMoney+Subs("零壹贰叁肆伍陆柒捌玖",Int(Round(lnMoney/10^i,10))*2+1,2)+Subs("分角元拾佰仟万拾佰仟亿拾佰仟万",i*2+1,2)
   lnMoney = Mod(lnMoney,10^i)
Endfor
lcMoney = Strtran(Strtran(Strtran(Strtran(Strtran(lcMoney,"零仟","零"),"零佰","零"),"零拾","零"),"零角","零"),"零分","整")
lcMoney = Strtran(Strtran(Strtran(Strtran(Strtran(lcMoney,"零零","零"),"零零","零"),"零亿","亿"),"零万","万"),"零元","元")
lcReturnValue = Iif(lcMoney="整","零元整",Strtran(Strtran(lcMoney,"亿万","亿"),"零整","整"))
Return (lcReturnValue)

回复列表 (共4个回复)

沙发

部分返回值不符合要求:

1001000.1,应返回“壹佰万零一仟元零壹角整”,实际返回“壹佰万一仟元壹角整”

在处理中间零值时不够完善。

板凳


呵呵,看看

3 楼

呵呵,这样的东西我是一直追求结果完美,不讲究“最简短”什么的。

4 楼

本人在本坛积攒的三帖小写转大写代码。希望大家能喜欢!

* =====焦夫发表的
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              &&返回结果,程序结束.


* =====wzxc发表的
  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

我来回复

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