VB 金额小写数字转大写

'本模块生成汉字大写的金额
'输入:数字
'输出:大写金额
Public Function Num2CharZheng(ByVal N As Double) As String
 On Error GoTo ErrorH
 If Right(Num2Char(N), 1) = "元" Or Right(Num2Char(N), 1) = "角" Then
    Num2CharZheng = Num2Char(N) + "正"
 Else
    Num2CharZheng = Num2Char(N)
 End If
 Exit Function
ErrorH:
 Num2CharZheng = "溢出"
End Function




'本模块生成汉字大写的金额
'输入:数字
'输出:大写金额
Public Function Num2Char(ByVal N As Double) As String
 On Error GoTo ErrorH
 
 If N >= 100000000 Then
  Num2Char = Num2CharLarge(Round(N, 2))
 Else
  Num2Char = Num2CharSmall(Round(N, 2))
 End If
 
 Exit Function
ErrorH:
 Num2Char = "溢出"
End Function


' 名称: CCh(Num2Char辅助函数)
'        得到一位数字 N1 的汉字大写
'        0 返回 ""
Private Function CCh(N1) As String
 Select Case N1
  Case 0
    CCh = "零"
  Case 1
    CCh = "壹"
  Case 2
    CCh = "贰"
  Case 3
    CCh = "叁"
  Case 4
    CCh = "肆"
  Case 5
    CCh = "伍"
  Case 6
    CCh = "陆"
  Case 7
    CCh = "柒"
  Case 8
    CCh = "捌"
  Case 9
    CCh = "玖"
 End Select
End Function




'名称: Num2CharSmall(Num2Char辅助函数)
'       得到数字 N1 的汉字大写
'       最大为 千万位
'       O 返回 ""
Public Function Num2CharSmall(N1) As String
 Dim tMoney As String
 Dim lMoney As String
 Dim tn '小数位置
 Dim S1 As String '临时STRING 小数部分
 Dim S2 As String '1000 以内
 Dim s3 As String '10000


 Dim ST1 As String, T1 As String




 If N1 = 0 Then
  Num2CharSmall = " "
  Exit Function
 End If
 
 If N1 < 0 Then
  Num2CharSmall = "负" + Num2CharSmall(Abs(N1))
  Exit Function
 End If
 
 tMoney = Trim(Str(N1))
 tn = InStr(tMoney, ".")   '小数位置
 S1 = ""


 If tn <> 0 Then
  ST1 = Right(tMoney, Len(tMoney) - tn)
   If ST1 <> "" Then
    T1 = Left(ST1, 1)
    ST1 = Right(ST1, Len(ST1) - 1)
    
    If T1 <> "0" Then
      S1 = S1 + CCh(Val(T1)) + "角"
    End If
    
    If ST1 <> "" Then
     T1 = Left(ST1, 1)
     S1 = S1 + CCh(Val(T1)) + "分"
    End If
  
   End If
   ST1 = Left(tMoney, tn - 1)
 Else
  ST1 = tMoney
 End If




 S2 = ""
 If ST1 <> "" Then
  T1 = Right(ST1, 1)
  ST1 = Left(ST1, Len(ST1) - 1)
  S2 = CCh(Val(T1)) + S2
 End If


 If ST1 <> "" Then
  T1 = Right(ST1, 1)
  ST1 = Left(ST1, Len(ST1) - 1)
  If T1 <> "0" Then
    S2 = CCh(Val(T1)) + "拾" + S2
  Else
    If Left(S2, 1) <> "零" Then S2 = "零" + S2
  End If
 End If


 If ST1 <> "" Then
  T1 = Right(ST1, 1)
  ST1 = Left(ST1, Len(ST1) - 1)
  If T1 <> "0" Then
    S2 = CCh(Val(T1)) + "佰" + S2
  Else
    If Left(S2, 1) <> "零" Then S2 = "零" + S2
  End If
 End If


 If ST1 <> "" Then
  T1 = Right(ST1, 1)
  ST1 = Left(ST1, Len(ST1) - 1)
  If T1 <> "0" Then
  S2 = CCh(Val(T1)) + "仟" + S2
  Else
    If Left(S2, 1) <> "零" Then S2 = "零" + S2
  End If
 End If


 s3 = ""
 If ST1 <> "" Then
  T1 = Right(ST1, 1)
  ST1 = Left(ST1, Len(ST1) - 1)
  s3 = CCh(Val(T1)) + s3
 End If




 If ST1 <> "" Then
  T1 = Right(ST1, 1)
  ST1 = Left(ST1, Len(ST1) - 1)
  If T1 <> "0" Then
  s3 = CCh(Val(T1)) + "拾" + s3
  Else
    If Left(s3, 1) <> "零" Then s3 = "零" + s3
  End If
 End If


 If ST1 <> "" Then
  T1 = Right(ST1, 1)
  ST1 = Left(ST1, Len(ST1) - 1)
  If T1 <> "0" Then
  s3 = CCh(Val(T1)) + "佰" + s3
  Else
   If Left(s3, 1) <> "零" Then s3 = "零" + s3
  End If
 End If


 If ST1 <> "" Then
  T1 = Right(ST1, 1)
  ST1 = Left(ST1, Len(ST1) - 1)
  If T1 <> "0" Then
  s3 = CCh(Val(T1)) + "仟" + s3
  End If
 End If


 If Right(S2, 1) = "零" Then S2 = Left(S2, Len(S2) - 1)
 If Len(s3) > 0 Then
  If Right(s3, 1) = "零" Then s3 = Left(s3, Len(s3) - 1)
  s3 = s3 & "万"
 End If


 Num2CharSmall = IIf(s3 & S2 = "", S1, s3 & S2 & "元" & S1)
End Function


'金额的人民币大写(Num2Char辅助函数)
'输入:数值型金额
'输出:大写格式
Public Function Num2CharLarge(ByVal M_Num As Double) As String
 On Error Resume Next
 Num2CharLarge = "N/A"
 
 Dim ZsFlg As Boolean
 ZsFlg = IIf(M_Num < 0, False, True)
 M_Num = Abs(M_Num)
 
 Dim Nt_Decj, Nt_Decf, M_Szstr, M_Numstr, M_Lenint, M_Lendec, M_Dxstr, M_I, M_a, M_b, M_c, M_d, M_Bbak As Variant
 Dim M_Dxint(13), M_Dxdec(2), M_SZ(13) As Variant
  
 If M_Num < 1 Then                                                          '新增的小于一元的情况!
  Nt_Decj = Val(Left(Right(Format(M_Num, "0.00"), 2), 1))                   '角
  Nt_Decf = Val(Right(Format(M_Num, "0.00"), 1))                            '分
  M_Szstr = "零壹贰叁肆伍陆柒捌玖"
  
   
  If Nt_Decj = 0 Then
   Num2CharLarge = Mid(M_Szstr, Nt_Decf + 1, 1) + "分"
  Else
   
   If Nt_Decf = 0 Then
    Num2CharLarge = Mid(M_Szstr, Nt_Decj + 1, 1) + "角"
   Else
    Num2CharLarge = Mid(M_Szstr, Nt_Decj + 1, 1) + "角" + Mid(M_Szstr, Nt_Decf + 1, 1) + "分"
   End If
  End If
   
  Exit Function
 End If
  
 M_Numstr = AllTrim(Format(M_Num, "#################.00"))      ' "1225.25"
 M_Lenint = Len(Mid(M_Numstr, 1, InStr(1, M_Numstr, ".") - 1))  ' len(mid("1225.25",1,5-1))  -> len("1225") -> 4      取出整数长度
 M_Lendec = IIf(M_Num - Int(M_Num) = 0, 0, 2)                   ' iif(1225.25-1225=0,0,2)    -> 2                     取出小数长度
  
 M_Dxstr = "万仟佰拾亿仟佰拾万仟佰拾元"
 M_Szstr = "零壹贰叁肆伍陆柒捌玖"
 'M_Szstr = " 壹贰叁肆伍陆柒捌玖"
  
 For M_I = 1 To 13                                              '针对M_Dxstr   13个
  M_Dxint(M_I) = Mid(M_Dxstr, 13 - M_I + 1, 1)                  'M_dxstr的反向数组    M_dxint(1)="元",M_dxint(2)="拾",......,M_dxint(13)="万",
  M_SZ(M_I) = IIf(M_I < 11, Mid(M_Szstr, M_I, 1), "")           'M_sz的正向数组       M_sz(1)="零",M_sz(2)="壹",...M_sz(10)="玖",M_sz(11-13)=""
 Next M_I
  
 M_Dxdec(1) = "角"
 M_Dxdec(2) = "分"
 M_Dxstr = ""                                                   '清空
  
 For M_I = 1 To M_Lenint                                        'M_lenint整数部分长度 -> 4             整数部分诸位取出
  M_a = Mid(Mid(M_Numstr, 1, M_Lenint), M_I, 1)                 'mid(mid("1225.25",1,4),1,1)-> 1 -> 2 -> 2 -> 5
  M_b = M_SZ(Val(M_a) + 1)                                      '整数部分诸位转化           ->壹 ->贰 ->贰 ->伍
  M_c = M_Dxint(M_Lenint - M_I + 1)                             'M_dxint(4-1+1)             ->仟 ->佰 ->拾 ->元
   
  If "" <> M_Dxstr Then
   M_d = Mid(M_Dxstr, Len(M_Dxstr) - 1, 1)
  Else
   M_d = ""
  End If
   
  M_b = IIf(M_b = "零" And (M_d = "零" Or M_Bbak = M_b Or M_c = "元" Or M_c = "万" Or M_c = "亿"), "", M_b)
  M_c = IIf(M_a = "0" And M_c <> "元" And M_c <> "万" And M_c <> "亿", "", M_c)
   
  If (M_c = "元" Or M_c = "万" Or M_c = "亿") And M_d = "零" And M_a = "0" Then
   M_Dxstr = Mid(M_Dxstr, 1, Len(M_Dxstr) - 1)
   M_d = Mid(M_Dxstr, Len(M_Dxstr) - 1, 1)
   M_c = IIf(M_c = "元" And M_d = "万" Or M_c = "万" And M_d = "亿", "", M_c)
  End If
   
  M_Dxstr = M_Dxstr + M_b + M_c
  M_Bbak = M_b
 Next M_I
  
 For M_I = 1 To M_Lendec                                                        '小数部分
  M_a = Mid(Mid(M_Numstr, M_Lenint + 2, M_Lendec), M_I, 1)                      'mid(mid("1225.25",4+2,2),1,1) -> mid("25",1,1)-> 2 ==> 5 诸位提取小数位
  M_b = IIf(M_a = "0" And M_Dxdec(M_I) = "分", "", M_SZ(Val(M_a) + 1))
  M_Dxstr = IIf(M_a <> "0", M_Dxstr + M_b + M_Dxdec(M_I), M_Dxstr + M_b + "")
 Next M_I
  
 Num2CharLarge = IIf(M_Lendec = 0, M_Dxstr + "整", M_Dxstr)
 Num2CharLarge = IIf(ZsFlg, Num2CharLarge, "负" + Num2CharLarge)
End Function
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值