汉语数字转换成阿拉伯数字

'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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ggggwhw

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值