7,765
社区成员
发帖
与我相关
我的任务
分享
Option Explicit
Function Cdata_to_Num(ByVal CdataStr As String, ByRef NumStr As String) As Integer
Dim i As Integer, Idx As Integer
Dim tmp As String, sTmp As String
Dim Char, CharUnit, rmbFormat, Num
'别字列表
Char = Array("○", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "千", "百", "正")
'标准字列表
CharUnit = Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾", "仟", "佰", "整")
'中文人民币格式列表
rmbFormat = Array("兆", "仟", "佰", "拾", "亿", "仟", "佰", "拾", "万", "仟", "佰", "拾", "元", "角", "分")
Num = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
'统一大写标准
For i = 0 To UBound(Char)
CdataStr = Replace(CdataStr, Char(i), CharUnit(i))
Next
'数字转换为阿拉伯数字
For i = 0 To UBound(Num)
CdataStr = Replace(CdataStr, CharUnit(i), Num(i))
Next
'将格式统一为:"#亿#仟#佰#拾#万#仟#佰#拾#元#角#分"
CdataStr = Replace(CdataStr, "0", "") '去掉0
CdataStr = Replace(CdataStr, "整", "") '去掉整
'只有角分的情况要加上元
If InStr(CdataStr, "元") = 0 Then
CdataStr = "0元" & CdataStr
End If
Idx = UBound(rmbFormat) + 1
For i = Len(CdataStr) To 2 Step -1
tmp = Mid(CdataStr, i, 1)
If Not IsNumeric(tmp) Then
Do
Idx = Idx - 1
If tmp = rmbFormat(Idx) Then
sTmp = Val(Mid(CdataStr, i - 1, 1)) & tmp & sTmp
Exit Do
Else
sTmp = "0" & rmbFormat(Idx) & sTmp
End If
Loop
End If
Next
'替换掉全部中文
sTmp = Replace(sTmp, "元", ".")
For i = 0 To UBound(rmbFormat)
sTmp = Replace(sTmp, rmbFormat(i), "")
Next
'输出
NumStr = Format(sTmp, "0.00")
Cdata_to_Num = 1
End Function
Private Sub Command1_Click()
Dim s As String
Call Cdata_to_Num("五亿元正", s)
Debug.Print s
Call Cdata_to_Num("一万零叁元零角陆分", s)
Debug.Print s
Call Cdata_to_Num("四拾壹亿叁仟陆百万零捌元", s)
Debug.Print s
Call Cdata_to_Num("玖分", s)
Debug.Print s
Call Cdata_to_Num("五角", s)
Debug.Print s
Call Cdata_to_Num("陆仟壹佰叁拾捌元五角一分", s)
Debug.Print s
End Sub
结果:
500000000.00
10003.06
4136000008.00
0.09
0.50
6138.51
Option Explicit
Function Cdata_to_Num(ByVal CdataStr As String, ByRef NumStr As String) As Integer
Dim i As Integer, Idx As Integer
Dim sLeft As String, sRight As String
Dim tmp As String, sTmp As String
Dim rmbUnit, ChrNum, rmbNum, Num
ChrNum = Array("○", "一", "二", "三", "四", "五", "六", "七", "八", "九", "十", "千", "百")
rmbNum = Array("零", "壹", "贰", "叁", "肆", "伍", "陆", "柒", "捌", "玖", "拾", "仟", "佰")
rmbUnit = Array("兆", "仟", "佰", "拾", "亿", "仟", "佰", "拾", "万", "仟", "佰", "拾", "元")
Num = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9)
'统一大写
For i = 0 To UBound(ChrNum)
CdataStr = Replace(CdataStr, ChrNum(i), rmbNum(i))
Next
'数字转换为阿拉伯数字
For i = 0 To UBound(Num)
CdataStr = Replace(CdataStr, rmbNum(i), Num(i))
Next
'按元分组处理
sLeft = Split(CdataStr, "元")(0) & "元"
sRight = Split(CdataStr, "元")(1)
'处理整数部分,将格式统一为"#亿#仟#佰#拾#万#仟#佰#拾#元"这样的格式
sLeft = Replace(sLeft, "0", "")
Idx = UBound(rmbUnit)
For i = Len(sLeft) To 2 Step -1
tmp = Mid(sLeft, i, 1)
If Not IsNumeric(tmp) Then
If tmp = rmbUnit(Idx) Then
sTmp = Val(Mid(sLeft, i - 1, 1)) & tmp & sTmp
Else
sTmp = "0" & rmbUnit(Idx) & sTmp
i = i + 1
End If
Idx = Idx - 1
End If
Next
'合并左右,替换掉全部中文
CdataStr = sTmp & sRight
CdataStr = Replace(CdataStr, "元", ".")
CdataStr = Replace(CdataStr, "角", vbNullString)
CdataStr = Replace(CdataStr, "分", vbNullString)
CdataStr = Replace(CdataStr, "整", vbNullString)
For i = 0 To UBound(rmbUnit)
CdataStr = Replace(CdataStr, rmbUnit(i), "")
Next
'输出
NumStr = Format(CdataStr, "0.00")
Cdata_to_Num = 1
End Function
Private Sub Command1_Click()
Dim s As String, ss As String
Dim i As Integer
s = "一万零叁元零角陆分"
i = Cdata_to_Num(s, ss)
Debug.Print ss
End Sub
'结果:10003.06