'Excel宏代码原创分享,转发请注明来源,作者:王欢为,WX:13772568903。
功能:将汉语数字转换成阿拉伯数字。
特点:1.汉语数字支持大写数字和小写数字,甚至大小写混写的情况。
特点:2.数字支持正数、负数、整数、小数、有或没有计数单位,数字前后有其他文字等情况。
有效的汉字形式:
小写汉字例子:"三百九十四亿〇五百九十九万〇二十二亿四千万〇三千五百九十亿〇四百九十五"
大写汉字例子:"贰佰肆拾陆亿陆仟贰佰陆拾伍万肆仟陆佰捌拾陆亿贰仟陆佰叁拾贰万肆仟陆佰"
混写的例子:"三百九十四亿零五百九十九万零二十伍万肆仟陆佰捌拾陆亿〇贰仟陆佰叁拾贰万"
正数的例子:"正三百零四"
负数的例子:"负三千九百四十"
整数的例子:"三千九百四十"
小数的例子:"三千九百四十点叁肆零伍"
不使用计数单位的例子:"一三七七二五六八九〇三"
汉字数字中,整数部分对〇不敏感:整数部分的〇少写或多写,只要符合读数习惯,不影响返回结果,小数部分〇会影响结果的。
特点:3.返回结果可以是文本,也可以是数值。
'以下是关于格式的举例说明:
FFXieshu (汉语数字)
FFXieshu ("十二亿三千四百五十六万七千八百九十点一二三四五六七八")
返回结果为文本型阿拉伯数字: _
"1234567890.12345678"
FFXieshu(汉语数字,2)
FFXieshu("十二亿三千四百五十六万七千八百九十点一二三四五六七八", 2)
返回结果为数值型阿拉伯数字,对于位数太多的数字,会返回近似值。: _
1234567890.12346
FFXieshu("十二亿三千四百五十六万七千八百九十点一二三四五六七八", 3)
返回结果为文本型阿拉伯数字,整数部分每3位由逗号隔开,符合国际习惯。 _
"1,234,567,890.12345678"
FFXieshu(汉语数字,4)
FFXieshu("十二亿三千四百五十六万七千八百九十点一二三四五六七八", 4)
返回结果为文本型阿拉伯数字,整数部分每4位由空格隔开,方便汉语读数。 _
"12 3456 7890.12345678"
将上面的所有小写汉字换成大写汉字,可以得到相同结果。
FFXieshu("壹拾贰亿叁仟肆佰伍拾六万柒仟捌佰玖拾点壹二叁四伍陆七捌", 4)
返回结果如下: _
"12 3456 7890.12345678"
如果数字前后有说明性文字,且说明性文字中不含数字关键字,也可以转换, _
其中数字关键字包括: _
"〇一二三四五六七八九零壹贰叁肆伍陆柒捌玖点十百千万亿拾佰仟萬什"
FFXieshu("张某资产:壹拾贰亿叁仟肆佰伍拾六万柒仟捌佰玖拾点壹二叁四伍陆七捌元", 3)
返回结果如下: _
"张某资产:1,234,567,890.12345678元"
注意上面用张某没有用张三是因为“三”是关键字,不能使用,否则会出错。
特点:4.输入汉字数字字符串,长度几乎无限(不是真的无限)。
缺点:1.此函数一次只能转换一个数字,不过在Excel表格中使用的话,够用了。
缺点:2.此函数运行效率不一定高,自己用是够用了,主要是分享编程思想。
具体函数如下:
Function FFXieshu(Str1, Optional ByVal Leixing1zhi4 As Integer = 1)
'Excel宏代码原创分享,转发请注明来源,作者:王欢为,WX:13772568903。
'以下是关于格式的举例说明:
'FFXieshu (汉语数字)
'FFXieshu ("十二亿三千四百五十六万七千八百九十点一二三四五六七八")
'返回结果为文本型阿拉伯数字: _
"1234567890.12345678"
'FFXieshu(汉语数字,2)
'FFXieshu("十二亿三千四百五十六万七千八百九十点一二三四五六七八", 2)
'返回结果为数值型阿拉伯数字,对于位数太多的数字,会返回近似值。: _
1234567890.12346
'FFXieshu("十二亿三千四百五十六万七千八百九十点一二三四五六七八", 3)
'返回结果为文本型阿拉伯数字,整数部分每3位由逗号隔开,符合国际习惯。 _
"1,234,567,890.12345678"
'FFXieshu(汉语数字,4)
'FFXieshu("十二亿三千四百五十六万七千八百九十点一二三四五六七八", 4)
'返回结果为文本型阿拉伯数字,整数部分每4位由空格隔开,方便汉语读数。 _
"12 3456 7890.12345678"
'将上面的所有小写汉字换成大写汉字,可以得到相同结果。
'FFXieshu("壹拾贰亿叁仟肆佰伍拾六万柒仟捌佰玖拾点壹二叁四伍陆七捌", 4)
'返回结果如下: _
"12 3456 7890.12345678"
'如果数字前后有说明性文字,且说明性文字中不含数字关键字,也可以转换, _
其中数字关键字包括: _
"〇一二三四五六七八九零壹贰叁肆伍陆柒捌玖点十百千万亿拾佰仟萬什"
'FFXieshu("张某资产:壹拾贰亿叁仟肆佰伍拾六万柒仟捌佰玖拾点壹二叁四伍陆七捌元", 3)
'返回结果如下: _
"张某资产:1,234,567,890.12345678元"
'注意上面用张某没有用张三是因为“三”是关键字,不能使用,否则会出错。
Dim Str2$, Str3$, Str4$, ii&, jj&, Num1&, Numy&, Stralb1$, Strhan1$, Strq1$, Strh1$, Strjsdw1$, Numjsdw1&
'默认返回结果为字符串,此结果为准确表达式,对数字的位数几乎不限。 _
如果可选参数Leixing1huo2赋值为2,则返回结果为数值,当数字位数太多时, _
返回结果为近似值,甚至有可能无法得到想要的结果。
'Str2开始等于Str1,后来剥离左侧非数字部分,剥离右侧非数字部分, _
剥离小数部分,用来表示Str1中的整数部分,转换完毕后,为空字符串。
'Str3在转换过程中表示Str2整数部分的每一个字符。
'Str4表示Str2转换过程中整数部分的每一次转换结果。
'Num1表示转换过程中Str2整数部分的每一个数字。
'Numy表示转换过程中Str2整数部分每次凑够亿位数的结果。
'Stralb1用来存放阿拉伯数字用到的符号。
'Strhan1用来存放汉语数字用到的符号。
'Strq1用来存放Str1左侧非数字部分文字和正负号。
'Strh1用来存放Str1右侧非数字部分文字和小数部分数字。
'Strjsdw1用来存放计数单位
Str2 = "" & Str1
If Str2 = "" Then
FFXieshu = ""
Exit Function
End If
Stralb1 = "01234567890123456789.十百千万亿十百千万十"
Strhan1 = "〇一二三四五六七八九零壹贰叁肆伍陆柒捌玖点十百千万亿拾佰仟萬什"
Strq1 = ""
Strh1 = ""
Strjsdw1 = "十百千万亿"
Numjsdw1 = 0
ii = 1
Do While ii <= Len(Str2)
jj = InStr(1, Strhan1, Mid(Str2, ii, 1))
If jj > 0 Then
If InStr(1, Strjsdw1, Mid(Stralb1, InStr(1, Strhan1, Mid(Str2, ii, 1)), 1)) > 0 Then
Numjsdw1 = Numjsdw1 + 1
End If
Str2 = Left(Str2, ii - 1) & Mid(Stralb1, InStr(1, Strhan1, Mid(Str2, ii, 1)), 1) & _
Right(Str2, Len(Str2) - ii)
ii = ii + 1
Else
If ii = 1 Then
If Mid(Str2, ii, 1) = "负" And InStr(1, Strhan1, Mid(Str2, 2, 1)) > 0 Then
Strq1 = Strq1 & "-"
ElseIf Mid(Str2, ii, 1) = "正" And InStr(1, Strhan1, Mid(Str2, 2, 1)) > 0 Then
Strq1 = Strq1 & "+"
Else
Strq1 = Strq1 & Mid(Str2, ii, 1)
End If
Else
Strh1 = Strh1 & Mid(Str2, ii, 1)
End If
Str2 = Left(Str2, ii - 1) & Right(Str2, Len(Str2) - ii)
End If
Loop
If Numjsdw1 = 0 Then
ii = InStr(1, Str2, ".")
If ii > 0 Then
Str4 = Left(Str2, ii - 1)
Str2 = Right(Str2, Len(Str2) - ii + 1)
Else
Str4 = Str2
Str2 = ""
End If
Else
If Left(Str2, 1) = "十" Then
Str2 = "1" & Str2
End If
Numy = 0 '用来累积够亿
Num1 = 0 '用来获取每位数
Str4 = ""
Do While Len(Str2) > 0
Str3 = Left(Str2, 1)
If Asc(Str3) > Asc("0") And Asc(Str3) - Asc("0") < 10 Then
Num1 = Asc(Str3) - Asc("0")
Else
Select Case Str3
Case Is = "十"
Numy = Numy + Num1 * 10
Num1 = 0
Case Is = "百"
Numy = Numy + Num1 * 100
Num1 = 0
Case Is = "千"
Numy = Numy + Num1 * 1000
Num1 = 0
Case Is = "万"
Numy = (Numy + Num1) * 10000
Num1 = 0
Case Is = "亿" '下一行如果增加一个变量可以写的紧凑一些。
Str4 = Str4 & Right("" & (Numy + Num1 + 100000000), _
Len("" & (Numy + Num1 + 100000000)) - 1)
Numy = 0
Num1 = 0
Case Is = "."
Exit Do
End Select
End If
Str2 = Right(Str2, Len(Str2) - 1)
Loop
If Numy + Num1 > 0 Then
Str4 = Str4 & Right("" & (Numy + Num1 + 100000000), _
Len("" & (Numy + Num1 + 100000000)) - 1)
Else
If Str4 <> "" Then
Str4 = Str4 & "00000000"
End If
End If
Do While Left(Str4, 1) = "0"
Str4 = Right(Str4, Len(Str4) - 1)
Loop
End If
If Leixing1zhi4 = 3 Then
ii = Len(Str4) - 3
Do While ii > 0
Str4 = Left(Str4, ii) & "," & Right(Str4, Len(Str4) - ii)
ii = ii - 3
Loop
ElseIf Leixing1zhi4 = 4 Then
ii = Len(Str4) - 4
Do While ii > 0
Str4 = Left(Str4, ii) & " " & Right(Str4, Len(Str4) - ii)
ii = ii - 4
Loop
End If
Str4 = Strq1 & Str4 & Str2 & Strh1
If Str4 = "" Then
Str4 = "0"
End If
If Leixing1zhi4 = 2 Then
FFXieshu = Val(Str4)
Else
FFXieshu = Str4
End If
End Function