Function Fun_换算中国数目字(数值 As String) As String
Dim TempIt(1 To 28), Temp As String
Dim TempLen, i, TempItNow As Integer
Dim IntNum As String
Dim Nums As String
Dim Zero As Boolean
For i = 1 To TempLen
TempItNow = Val(Mid(IntNum, i, 1))
Temp = TempIt(TempLen - i + 1)
If TempItNow <> 0 Then
If Zero = True Then
Fun_换算中国数目字 = Fun_换算中国数目字 + "零"
Zero = False
End If
If i = 1 And TempItNow = 1 And Temp = "拾" Then
Fun_换算中国数目字 = Fun_换算中国数目字 + "拾"
Else
Fun_换算中国数目字 = Fun_换算中国数目字 + Mid(Nums, TempItNow, 1) + Temp
End If
Else
If Zero = False Then
Zero = True
End If
End If
Select Case TempLen - i + 1
Case 5
Fun_换算中国数目字 = Fun_换算中国数目字 + "万"
Case 9
Fun_换算中国数目字 = Fun_换算中国数目字 + "亿"
Case 13
Fun_换算中国数目字 = Fun_换算中国数目字 + "万"
Case 17
Fun_换算中国数目字 = Fun_换算中国数目字 + "兆"
Case 21
Fun_换算中国数目字 = Fun_换算中国数目字 + "万"
Case 25
Fun_换算中国数目字 = Fun_换算中国数目字 + "亿"
End Select
Next
呵呵,上面的程序说明补充一下,再发一遍:
Private Function prvCnvSpell(ByVal ycRes As String) As String
'定义转换用常量,其中@为个位占位符,结果输出时统一去除
Const cnsAdvPos As String = "@万亿"
Const cnsPostion As String = "@拾佰仟"
Const cnsNumber As String = "零壹贰叁肆伍陆柒捌玖"
Dim ycAdvPos As Integer '定义每四位为一级,当前数所在级,用于转换“万、亿”
Dim ycPostion As Integer '在级中,当前数所处的位置,用于转换“拾、佰、仟”
Dim ycVaildCount As Integer '在级中,记录有效数字个数
Dim yck As Integer '循环变量,用于扫描字符串
Dim ycTmpNum As String '保存当前字符
Dim ycVaildZero As Long '这个变量的用法不好描述,下面用到时再讲
Dim ycResult As String '保存转换后的结果
ycRes = StrReverse(Trim(ycRes)) '获取逆序字符串,方便后面的处理
For yck = 0 To Len(ycRes) - 1 '扫描数字串
ycAdvPos = yck \ 4 '获取当前数字所在级
ycPostion = yck Mod 4 '获取当前数字所在位
If ycPostion = 0 Then '当所在位为“个”位时
ycVaildCount = 0 '有效数字清零
End If
ycTmpNum = Mid(ycRes, yck + 1, 1) '获取当前数字
If Val(ycTmpNum) > 0 Then '当前数字不为0
If ycPostion = 0 Then '如果为“个”位
'结果=结果& 级 & 位 & 当前数字;其中位为“@”,在结果输出中再统一去掉
ycResult = ycResult & Mid(cnsAdvPos, ycAdvPos + 1, 1) & Mid(cnsPostion, ycPostion + 1, 1) & Mid(cnsNumber, Val(ycTmpNum) + 1, 1)
ElseIf ycPostion = 1 And Val(ycTmpNum) = 1 Then '当位为“十”位,且当前数字为“1”,该段程序主要处理“10:拾,100000:拾万”这样的数字
ycVaildZero = Val(StrReverse(Right(ycRes, Len(ycRes) - (yck + 1)))) '判断其余位是否有大于0的数
If ycVaildZero > 0 Then '有
'照常处理
ycResult = ycResult & Mid(cnsPostion, ycPostion + 1, 1) & Mid(cnsNumber, Val(ycTmpNum) + 1, 1)
Else '无
'显示类似:10:拾,100000:拾万;这样的数字
ycResult = ycResult & Mid(cnsPostion, ycPostion + 1, 1)
End If
Else
'其余的数字也按下面格式处理:
'结果=结果& 级 & 位 & 当前数字;
ycResult = ycResult & Mid(cnsPostion, ycPostion + 1, 1) & Mid(cnsNumber, Val(ycTmpNum) + 1, 1)
End If
ycVaildCount = ycVaildCount + 1
Else '当前数字为0
'主要避免“10000显示成壹”,产生这个结果的原因由后段程序引起
If ycPostion = 0 Then
ycVaildZero = Val(StrReverse(Mid(ycRes, yck + 1, 4)))
If ycVaildZero > 0 Then
ycResult = ycResult & Mid(cnsAdvPos, ycAdvPos + 1, 1)
End If
End If
'主要避免“1001:壹仟零拾零壹”的现象
If ycVaildCount > 0 Then
ycVaildCount = 0
ycResult = ycResult & Mid(cnsNumber, Val(ycTmpNum) + 1, 1)
End If
End If
Next yck
prvCnvSpell = StrReverse(Trim(Replace(ycResult, "@", "")))
End Function
Private Function prvCnvSpell(ByVal ycRes As String) As String
Const cnsAdvPos As String = "@万亿"
Const cnsPostion As String = "@拾佰仟"
Const cnsNumber As String = "零壹贰叁肆伍陆柒捌玖"
Dim ycAdvPos As Integer
Dim ycPostion As Integer
Dim ycVaildCount As Integer
Dim yck As Integer
Dim ycTmpNum As String
Dim ycVaildZero As Long
Dim ycResult As String
ycRes = StrReverse(Trim(ycRes))
For yck = 0 To Len(ycRes) - 1
ycAdvPos = yck \ 4
ycPostion = yck Mod 4
If ycPostion = 0 Then
ycVaildCount = 0
End If
ycTmpNum = Mid(ycRes, yck + 1, 1)
If Val(ycTmpNum) > 0 Then
If ycPostion = 0 Then
ycResult = ycResult & Mid(cnsAdvPos, ycAdvPos + 1, 1) & Mid(cnsPostion, ycPostion + 1, 1) & Mid(cnsNumber, Val(ycTmpNum) + 1, 1)
ElseIf ycPostion = 1 And Val(ycTmpNum) = 1 Then
ycVaildZero = Val(StrReverse(Right(ycRes, Len(ycRes) - (yck + 1))))
If ycVaildZero > 0 Then
ycResult = ycResult & Mid(cnsPostion, ycPostion + 1, 1) & Mid(cnsNumber, Val(ycTmpNum) + 1, 1)
Else
ycResult = ycResult & Mid(cnsPostion, ycPostion + 1, 1)
End If
Else
ycResult = ycResult & Mid(cnsPostion, ycPostion + 1, 1) & Mid(cnsNumber, Val(ycTmpNum) + 1, 1)
End If
ycVaildCount = ycVaildCount + 1
Else
If ycPostion = 0 Then
ycVaildZero = Val(StrReverse(Mid(ycRes, yck + 1, 4)))
If ycVaildZero > 0 Then
ycResult = ycResult & Mid(cnsAdvPos, ycAdvPos + 1, 1)
End If
End If
If ycVaildCount > 0 Then
ycVaildCount = 0
ycResult = ycResult & Mid(cnsNumber, Val(ycTmpNum) + 1, 1)
End If
End If
Next yck
prvCnvSpell = StrReverse(Trim(Replace(ycResult, "@", "")))
End Function
Function 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 Function
Private Sub Command1_Click()
MsgBox daxie("1218212212309322.3238")
End Sub