我在支票程序中用如下语句转化大写,一般情况下没什么问题,但是到千位和十位都是零的时候,千位的零不显示。结果被银行退回来了,郁闷啊。举例:30801,我的软件显示为“叁万捌佰零壹圆整”,银行认为是“叁万零捌佰零壹圆整”。
跪求各位高手帮我看看下面的语句。谢谢!  我知道问题出在倒数第五行,但不知道怎么在现有结构基础上修改,请高手帮忙!      c1 = "零壹贰叁肆伍陆柒捌玖"
    c2 = "拾佰仟"
    Private Function rmb(s As Currency) As String
    Dim str0 As String, strFen As String, strYuan As String, strWan As String, strYi As String
    Dim strWanYi As String
    Dim strTemp As String
    Dim Lpoint As Integer
    Dim flag As Boolean
   
    
    If Abs(s) < 0.01 Then rmb = "零": Exit Function
    
    str0 = LTrim(str$(Abs(s)))
    Lpoint = InStrRev(str0, ".")
    
    If Lpoint = 0 Then
        str0 = str0 & ".00"
    Else
        str0 = Left(str0 & "00", Lpoint + 2)
    End If
    
    strFen = Right(str0, 2)
    strYuan = Left(str0, Len(str0) - 3)
    If Val(strYuan) = 0 Then flag = True
    
    If Len(strYuan) > 4 Then
        strWan = Left(strYuan, Len(strYuan) - 4)
        strYuan = Right(strYuan, 4)
    End If
    
    If Len(strWan) > 4 Then
        strYi = Left(strWan, Len(strWan) - 4)
        strWan = Right(strWan, 4)
    End If
    
    If Len(strYi) > 4 Then
        strWanYi = Left(strYi, Len(strYi) - 4)
        strYi = Right(strYi, 4)
    End If
    
    If Right(strFen, 1) = "0" Then
        strTemp = "整"
        If Left(strFen, 1) <> "0" Then strTemp = Mid(c1, Val(Left(strFen, 1)) + 1, 1) & "角整"
    Else
        If Left(strFen, 1) = "0" Then
            If flag Then
                strTemp = Mid(c1, Val(Right(strFen, 1)) + 1, 1) & "分"
            Else
                strTemp = "零" & Mid(c1, Val(Right(strFen, 1)) + 1, 1) & "分"
            End If
        Else
            strTemp = Mid(c1, Val(Left(strFen, 1)) + 1, 1) & "角" & Mid(c1, Val(Right(strFen, 1)) + 1, 1) & "分"
        End If
    End If
    
    If strYuan <> "" Then strTemp = change(strYuan) & "元" & strTemp
    If strWan <> "" And Val(strWan) <> 0 Then strTemp = change(strWan) & "万" & strTemp
    If strYi <> "" Then strTemp = change(strYi) & "亿" & strTemp
    
    If strWanYi <> "" Then strTemp = change(strWanYi) & "万" & strTemp
    
    rmb = strTemp
    Exit Function
End FunctionPrivate Function change(s As String) As String
    Dim c As String, str As String
    Dim L As Integer, i As Integer
    Dim f1 As Boolean, f2 As Boolean
    str = ""
    f1 = False
    f2 = False
    L = Len(s)
    If Right(s, 1) <> "0" Then
        str = Mid(c1, Val(Right(s, 1)) + 1, 1)
        f1 = True
    End If
    For i = L - 1 To 1 Step -1
        c = Mid(s, i, 1)
        If c <> "0" Then
            str = Mid(c1, Val(c) + 1, 1) & Mid(c2, L - i, 1) & str
            f1 = True
        Else
            If f1 And (Not f2) Then str = "零" & str: f2 = True
        End If
    Next i
    change = str
End Function

解决方案 »

  1.   

    不记得从哪里得到的函数了,仅供参考
    ?up("30801")
    叁万零捌佰零壹元
    *************************************************
    Function Up(Dxs As String) As String
    '检测为空时
     If Trim(Dxs) = "" Then
        MsgBox "没有数字,不能转换!", vbOKOnly + 32
        Exit Function
    End If
      Dim Sw As Integer, SzP As Integer, SzUp As Integer, TempStr As String, DXStr As String
        Sw = Len(Trim(Dxs))
        SzP = InStr(1, Trim(Dxs), ".")
    If SzP = 0 Then
       Dim i As Integer
         For i = 1 To Sw
             TempStr = right(Trim(Dxs), i)
             TempStr = left(TempStr, 1)
             TempStr = Converts(TempStr)
             Select Case i
               Case 1
                   If TempStr = "零" Then
                      TempStr = "元"
                       Else
                      TempStr = TempStr + "元"
                   End If
               Case 2
                   If TempStr = "零" Then
                      TempStr = "零"
                    Else
                      TempStr = TempStr + "拾"
                   End If
               Case 3
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "佰"
                   End If
                Case 4
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "仟"
                   End If
                Case 5
                   If TempStr = "零" Then
                      TempStr = "万"
                       Else
                      TempStr = TempStr + "万"
                   End If
                Case 6
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "拾"
                   End If
                Case 7
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "佰"
                   End If
                Case 8
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "仟"
                   End If
                Case 9
                   If TempStr = "零" Then
                      TempStr = "亿"
                       Else
                      TempStr = TempStr + "亿"
                   End If
             End Select
        Dim TempA As String
            TempA = left(Trim(DXStr), 1)
        If TempStr = "零" Then
          Select Case TempA
           Case "零"
                DXStr = DXStr
           Case "元"
                DXStr = DXStr
           Case "万"
                DXStr = DXStr
           Case "亿"
                DXStr = DXStr
           Case Else
                DXStr = TempStr + DXStr
          End Select
          Else
           DXStr = TempStr + DXStr
        End If
         Next
      Else
        For i = 1 To SzP - 1
             TempStr = right(Trim(Dxs), i + (Sw - SzP + 1))
             TempStr = left(TempStr, 1)
             TempStr = Converts(TempStr)
             Select Case i
               Case 1
                   If TempStr = "零" Then
                      TempStr = "元"
                       Else
                      TempStr = TempStr + "元"
                   End If
               Case 2
                   If TempStr = "零" Then
                      TempStr = "零"
                    Else
                      TempStr = TempStr + "拾"
                   End If
               Case 3
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "佰"
                   End If
                Case 4
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "仟"
                   End If
                Case 5
                   If TempStr = "零" Then
                      TempStr = "万"
                       Else
                      TempStr = TempStr + "万"
                   End If
                Case 6
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "拾"
                   End If
                Case 7
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "佰"
                   End If
                Case 8
                   If TempStr = "零" Then
                      TempStr = "零"
                       Else
                      TempStr = TempStr + "仟"
                   End If
                Case 9
                   If TempStr = "零" Then
                      TempStr = "亿"
                       Else
                      TempStr = TempStr + "亿"
                   End If
                Case Else
                  '超过999999999时自动删除
                  TempStr = ""
             End Select
            TempA = left(Trim(DXStr), 1)
        If TempStr = "零" Then
          Select Case TempA
           Case "零"
                DXStr = DXStr
           Case "元"
                DXStr = DXStr
           Case "万"
                DXStr = DXStr
           Case "亿"
                DXStr = DXStr
           Case Else
                DXStr = TempStr + DXStr
          End Select
          Else
           DXStr = TempStr + DXStr
        End If
         Next
    '计算小数
       Dim DxstrX As String, XStr As String
          XStr = right(Trim(Dxs), Sw - SzP)
            For i = 1 To Sw - SzP
             TempStr = left(XStr, i)
             TempStr = right(TempStr, 1)
             TempStr = Converts(TempStr)
             Select Case i
               Case 1
                If TempStr = "零" Then
                   TempStr = ""
                   Else
                   TempStr = TempStr + "角"
                End If
               Case 2
                If TempStr = "零" Then
                   TempStr = ""
                   Else
                   TempStr = TempStr + "分"
                   End If
                Case Else
                  '超过两位小数时,自动删除
                  TempStr = ""
             End Select
            DxstrX = DxstrX + TempStr
         Next
         DXStr = DXStr + DxstrX
    End If
        Up = DXStr
    End FunctionFunction Converts(NumStr As String) As String
        Select Case Val(NumStr)
          Case 0
            Converts = "零"
          Case 1
            Converts = "壹"
          Case 2
            Converts = "贰"
          Case 3
            Converts = "叁"
          Case 4
            Converts = "肆"
          Case 5
            Converts = "伍"
          Case 6
             Converts = "陆"
          Case 7
             Converts = "柒"
          Case 8
             Converts = "捌"
          Case 9
             Converts = "玖"
        End Select
    End Function
      

  2.   

    参考:
    http://community.csdn.net/Expert/topic/5291/5291672.xml?temp=.4437372
      

  3.   

    另参考:
    http://community.csdn.net/Expert/topic/5290/5290745.xml?temp=.6544153我写的一个财务软件里面用的,直接扒下来的函数,还热的呢
      

  4.   

    http://www.egooglet.com/static_html/200511121314332748admin.html
    源码
      

  5.   

    0.12
    银行怎么叫:either 元壹角贰分 or 零元壹角贰分 or 壹角贰分
      

  6.   

    以前写的一段代码,crystal report语法的local stringvar array aChr:=["壹","贰","叁","肆","伍","陆","柒","捌","玖"];
    local stringvar array aCng:=["","拾","佰","仟","萬","拾","佰","仟","亿","拾"];
    local stringvar array aCnl:=["角","分"];
    local stringvar sTotalamt;
    local stringvar sLc;
    local stringvar sRc;
    local stringvar sResult;
    local numbervar i;sTotalamt:=replace(totext(cdbl({apupurheadreff.ptot}),2),",","");
    //stotalamt:="1020001.08";sLc:=StrReverse(split(sTotalamt,".",2)[1]);
    sRc:=split(sTotalamt,".",2)[2];sResult:="";
    for i:=1 to length(sLc) do
    (
        if sLc[i]="0" then
        (   
            if Right(sResult,1)<>"零" and sResult<>"" then
                sResult:=sResult & "零"; 
        )           
        else
            sResult:=sResult & aCng[i] & aChr[int(tonumber(sLc[i]))];
    );    if sResult<>"" then
        sResult:=StrReverse(sResult) & "元";for i:=1 to length(sRc) do
    (
        if sRc[i]<>"0" then
            sResult:=sResult & aChr[int(tonumber(sRc[i]))] & aCnl[i];
    );
    "合计:" & sResult & "整";
      

  7.   

    EnToCh("23, 532, 329.03")=贰仟叁佰伍拾叁万贰仟叁佰贰拾玖元零叁分
      

  8.   

    code:
    http://community.csdn.net/Expert/TopicView3.asp?id=5291672
    http://community.csdn.net/Expert/TopicView3.asp?id=5290745
      

  9.   

    其实数据中有逗号什么的都很容易解决,一个REPLACE就叫他消失了.
      

  10.   

    code:
    http://community.csdn.net/Expert/TopicView3.asp?id=5291672
    http://community.csdn.net/Expert/TopicView3.asp?id=5290745我测试过,上面的链接中的Code可以用,稍微改一点。
    EnToCh("23, 532, 329.03")=贰仟叁佰伍拾叁万贰仟叁佰贰拾玖元零叁分
    EnToCh支持“,”good luck!
      

  11.   

    其实数据中有逗号什么的都很容易解决,一个REPLACE就叫他消失了.
    ============================================================
    对,完全可以通过前期的预处理把数据整理成简单有效的格式
      

  12.   

    恩,把我原来的代码也修改好了,象 0.20这样的数字,就直接翻译成贰角
    至于数字中间的逗号,其实最简单不过了,一个REPLACE就消失了
      

  13.   

    WallesCai's code works.I suggest LZ checking his code.
      

  14.   

    To WallesCai:
    Please update your code for LZ and us.
      

  15.   

    多年前写的,正好满足你的要求:
    http://blog.csdn.net/northwolves/archive/2004/05/30/19599.aspxFunction daxie(money As String) As String '
    Dim x As String, y As String
    Const zimu = ".sbqwsbqysbqwsbq" '定义位置代码
    Const letter = "0123456789sbqwy.zjf" '定义汉字缩写
    Const upcase = "零壹贰叁肆伍陆柒捌玖拾佰仟萬億圆整角分" '定义大写汉字
    Dim temp As String
    temp = money
    If InStr(temp, ".") > 0 Then temp = Left(temp, InStr(temp, ".") - 1)If Len(temp) > 16 Then MsgBox "数目太大,无法换算!请输入一亿亿以下的数字", 64, "错误提示": Exit Function '只能转换一亿亿元以下数目的货币!x = Format(money, "0.00") '格式化货币
    y = ""
    For i = 1 To Len(x) - 3
    y = y & Mid(x, i, 1) & Mid(zimu, Len(x) - 2 - i, 1)
    Next
    If Right(x, 3) = ".00" Then
    y = y & "z"          '***元整
    Else
     y = y & Left(Right(x, 2), 1) & "j" & Right(x, 1) & "f"     '*元*角*分
     End If
    y = Replace(y, "0q", "0") '避免零千(如:40200肆萬零千零贰佰)
    y = Replace(y, "0b", "0") '避免零百(如:41000肆萬壹千零佰)
    y = Replace(y, "0s", "0") '避免零十(如:204贰佰零拾零肆)Do While y <> Replace(y, "00", "0")
    y = Replace(y, "00", "0") '避免双零(如:1004壹仟零零肆)
    Loop
    y = Replace(y, "0y", "y") '避免零億(如:210億     贰佰壹十零億)
    y = Replace(y, "0w", "w") '避免零萬(如:210萬     贰佰壹十零萬)
    y = IIf(Len(x) = 5 And Left(y, 1) = "1", Right(y, Len(y) - 1), y) '避免壹十(如:14壹拾肆;10壹拾)
    y = IIf(Len(x) = 4, Replace(y, "0.", ""), Replace(y, "0.", ".")) '避免零元(如:20.00贰拾零圆;0.12零圆壹角贰分)For i = 1 To 19
    y = Replace(y, Mid(letter, i, 1), Mid(upcase, i, 1)) '大写汉字
    Next
    daxie = y
    End FunctionPrivate Sub Command1_Click()
    MsgBox daxie("30801")  ' return: 叁万零捌佰零壹圆整
    End Sub