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

'Excel宏代码原创分享,转发请注明来源,作者:王欢为,WX:13772568903。

功能:将阿拉伯数字转换成汉语数字。

特点:1.可以转换成小写汉字和大写汉字两种常用表达方式中的一种。效果如下:

FFDushu(阿拉伯数字)
'返回“〇一二三四五六七八九十百千万亿”这样的数字
FFDushu(阿拉伯数字,2)
'返回“零壹贰叁肆伍陆柒捌玖拾佰仟万亿”这样的数字

特点:2.阿拉伯数字可以是整数或小数,可以是正数或负数,同一个数字中间也可以用逗号或空格分段。

特点:3.输入的阿拉伯数字可以是字符串,也可以是手写小数形式,不支持其它数学表达式,不支持科学记数法。

有效的阿拉伯数字形式如下:
整数例子:1572
小数例子:38.45
正数例子:2453
负数例子:-592.56
字符串形式的阿拉伯数字:"1526462981.264"
空格或逗号分段的例子:"369 25634,56 597569 452,48218.356 695"
一个阿拉伯数字数字前后均有说明性汉字的例子:张三净资产-894.50元

特点:4.输入字符串形式的字符串,长度几乎无限(不是真的无限)。 

缺点:1.此函数一次只能转换一个数字,不过在Excel表格中使用的话,够用了。

缺点:2.此函数运行效率不一定高,自己用是够用了,主要是分享编程思想。

Function FFDushu(Str1$, Optional ByVal Leixing1huo2 As Integer = 1)
    Dim Str2$, Str3$, Str4$, Str5$, Jieguo1$, Shuji1%, Stralb1$, _
    Strq1$, Strh1$, Strhan1$, Strhan2$, Strquling1$, Strquling2$, _
    Strfenduan1$, ii%, Weizhi1%
    'Excel宏代码原创分享,转发请注明来源,作者:王欢为,WX:13772568903。
    '默认返回结果为小写汉字表达式,如果可选参数Leixing1huo2赋值为2,则返回结果为大写汉字表达式。
    'Str2开始等于Str1,后来剥离左侧非数字部分,剥离右侧非数字部分, _
            剥离小数部分,用来表示Str1中的整数部分,转换完毕后,为空字符串。
    'Str3在转换过程中用来重复提取Str2后四位。
    'Str4表示Str2转换过程中Str3的转换结果。
    'Str5用来存放Str1的小数部分。
    'Jieguo1用来存放转换结果的数值部分。
    'Shuji1用来标记所选取的Str3在原来Str1中的数级,0是个级、1是万级、2是亿级。
    'Num1表示转换过程中Str2整数部分的每一个数字。
    'Numy表示转换过程中Str2整数部分每次凑够亿位数的结果。
    'Stralb1用来存放阿拉伯数字用到的符号。
    'Strhan1用来存放汉语数字用到的符号。
    'Strq1用来存放Str1左侧非数字部分文字和正负号。
    'Strh1用来存放Str1右侧非数字部分文字和小数部分数字。
    'Strquling1用来存放一些特殊字段,该字段用来删除多于的〇, _
            使用该字段是为了简化两种转换的代码总量。
    'Strhan2和Strquling2分别是Strhan1和Strquling1的大写表达形式,备用。
    'Strfenduan1用来标记可能出现的数字之间的分段符号。
    Stralb1 = "0123456789"
    Strhan1 = "〇一二三四五六七八九"
    Strhan2 = "零壹贰叁肆伍陆柒捌玖"
    Strquling1 = "〇千〇百〇十〇〇"
    Strquling2 = "零仟零佰零拾零零"
    Strfenduan1 = ", , "
    If Leixing1huo2 = 2 Then
        Strhan1 = Strhan2
        Strquling1 = Strquling2
    End If
    Str2 = "" & Str1
    If Str2 = "" Then
        FFDushu = ""
        Exit Function
    End If
    '判断数字前面是否有内容
    Strq1 = ""
    Do While InStr(1, Stralb1, Left(Str2, 1)) < 1
        If Left(Str2, 1) = "-" And InStr(1, Stralb1, Mid(Str2, 2, 1)) > 0 Then
            Strq1 = Strq1 & "负" ''Strq1用来存放结果的正负号以及数字前的其他内容。
        ElseIf Left(Str2, 1) = "+" And InStr(1, Stralb1, Mid(Str2, 2, 1)) > 0 Then
            Strq1 = Strq1 & "正" ''Strq1用来存放结果的正负号以及数字前的其他内容。
        Else
            Strq1 = Strq1 & Left(Str2, 1)
        End If
        Str2 = Right(Str2, Len(Str2) - 1) 'Str2暂时存放绝对值
        If Str2 = "" Then
            FFDushu = Strq1
            Exit Function
        End If
    Loop
    '判断数字后面是否有内容
    Strh1 = ""
    Do While InStr(1, Stralb1, Right(Str2, 1)) < 1
        Strh1 = Strh1 & Right(Str2, 1)
        Str2 = Left(Str2, Len(Str2) - 1) 'Str2暂时存放绝对值
    Loop
    '去除Str2中间的分段符
    For ii = 1 To Len(Strfenduan1)
        Weizhi1 = InStr(Str2, Mid(Strfenduan1, ii, 1))
        Do While Weizhi1 > 0
            Str2 = Left(Str2, Weizhi1 - 1) & Right(Str2, Len(Str2) - Weizhi1)
            Weizhi1 = InStr(Str2, Mid(Strfenduan1, ii, 1))
        Loop
    Next
    '去除Str2开头的0
    Do While Left(Str2, 1) = "0"
        Str2 = Right(Str2, Len(Str2) - 1)
    Loop
    Shuji1 = 0 'Shuji1用来标记数级,0是个级、1是万级、2是亿级。
    Jieguo1 = "" 'Jieguo1用来存放结果的数值部分。
    '如果不是整数,拆分这个数字的整数部分和小数部分
    Str5 = "" 'Str5用来存放小数部分
    Weizhi1 = InStr(Str2, ".")
    If Weizhi1 > 0 Then
        Str5 = Right(Str2, Len(Str2) - Weizhi1) 'Str5用来存放小数部分
        Str2 = Left(Str2, Weizhi1 - 1) 'Str2用来存放整数部分
    End If
    Do While Len(Str2) > 0
        '每次读取后Str2四位数字到Str3,Str2剔除后四位
        If Len(Str2) <= 4 Then
            Str3 = Str2
            Str2 = ""
        Else
            Str3 = Right(Str2, 4) 'Str3用来存放Str2的后四位
            Str2 = Left(Str2, Len(Str2) - 4) '剔除Str2的后四位
        End If
        '按照Str3的长度插入“千,百,十”
        Str4 = "" 'Str4用来临时存放Str3的读法
        If Len(Str3) = 4 Then
        '下面用子函数会更紧凑。考虑到读数有两种表达式,所以写复杂了。
            Str4 = Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 1, 1))), 1) & Mid(Strquling1, 2, 1) & _
                Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 2, 1))), 1) & Mid(Strquling1, 4, 1) & _
                Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 3, 1))), 1) & Mid(Strquling1, 6, 1) & _
                Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 4, 1))), 1) & Str4
        ElseIf Len(Str3) = 3 Then
            Str4 = Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 1, 1))), 1) & Mid(Strquling1, 4, 1) & _
                Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 2, 1))), 1) & Mid(Strquling1, 6, 1) & _
                Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 3, 1))), 1) & Str4
        ElseIf Len(Str3) = 2 Then
            Str4 = Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 1, 1))), 1) & Mid(Strquling1, 6, 1) & _
                Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 2, 1))), 1) & Str4
        ElseIf Len(Str3) = 1 Then
            Str4 = Mid(Strhan1, InStr(1, Stralb1, (Mid(Str3, 1, 1))), 1) & Str4
        End If
        '去除中间多余的〇
        'Str4 = FFQuling(Str4)
        For ii = 1 To Len(Strquling1) Step 2
            Do While InStr(1, Str4, Mid(Strquling1, ii, 2)) > 0
                Str4 = Left(Str4, InStr(1, Str4, Mid(Strquling1, ii, 2))) & _
                    Right(Str4, Len(Str4) - InStr(1, Str4, Mid(Strquling1, ii, 2)) - 1)
            Loop
        Next
        '去除末尾的〇
        Do While Right(Str4, 1) = Left(Strhan1, 1)
            Str4 = Left(Str4, Len(Str4) - 1)
        Loop
        '根据Shuji1的情况插入“万,亿”
        If Shuji1 = 0 Then
            Shuji1 = 1
            Jieguo1 = Str4 & Jieguo1
        Else
            If Str4 = "" Then
                If Shuji1 = 1 Then
                    Jieguo1 = Left(Strhan1, 1) & Jieguo1
                Else
                    Jieguo1 = Mid("万亿", Shuji1, 1) & Jieguo1
                End If
            Else
                Jieguo1 = Str4 & Mid("万亿", Shuji1, 1) & Jieguo1
            End If
            Shuji1 = 3 - Shuji1
        End If
        '去除中间多余的〇
        'Str4 = FFQuling(Jieguo1)
        For ii = 1 To Len(Strquling1) Step 2
            Do While InStr(1, Jieguo1, Mid(Strquling1, ii, 2)) > 0
                Jieguo1 = Left(Jieguo1, InStr(1, Jieguo1, Mid(Strquling1, ii, 2))) & _
                    Right(Jieguo1, Len(Jieguo1) - InStr(1, Jieguo1, Mid(Strquling1, ii, 2)) - 1)
            Loop
        Next
        Str4 = Jieguo1
    Loop
    '去除末尾的〇
    Do While Right(Jieguo1, 1) = Left(Strhan1, 1)
        Jieguo1 = Left(Jieguo1, Len(Jieguo1) - 1)
    Loop
    If Jieguo1 = "" Then
        Jieguo1 = Left(Strhan1, 1)
    End If
    If Left(Jieguo1, 2) = "一十" Then
        Jieguo1 = Right(Jieguo1, Len(Jieguo1) - 1)
    End If
    If Len(Str5) > 0 Then '判断是不是有小数部分
        Jieguo1 = Jieguo1 & "点"
        For ii = 1 To Len(Str5)
            Jieguo1 = Jieguo1 & Mid(Strhan1, InStr(1, Stralb1, (Mid(Str5, ii, 1))), 1)
        Next
    End If
    FFDushu = Strq1 & Jieguo1 & Strh1
End Function

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在C#中,可以使用以下方法将中文汉语数字阿拉伯数字相互转化。 1. 将阿拉伯数字转换为中文汉语数字: 可以使用一个方法,将阿拉伯数字的每一位转换为对应的中文数字。例如,可以创建一个方法`OneBitNumberToChinese`,将数字1-9转换为中文数字。然后,可以根据阿拉伯数字的位数,逐位转换为中文数字,并拼接起来。\[1\] 2. 将中文汉语数字转换阿拉伯数字: 可以使用一个方法,将中文汉语数字的每一位转换为对应的阿拉伯数字。可以创建一个方法`FFXieshu`,接受中文汉语数字作为参数,并返回对应的阿拉伯数字。该方法可以处理整数、小数、正数、负数等情况。\[2\]\[3\] 需要注意的是,转换中文汉语数字阿拉伯数字时,要考虑到数字的位数、小数点、计数单位等情况,以确保转换结果的准确性。 以下是一个示例代码,演示了如何在C#中实现中文汉语数字阿拉伯数字的相互转化: ```csharp public class ChineseNumberConverter { private static string\[\] chineseDigits = { "〇", "一", "二", "三", "四", "五", "六", "七", "八", "九" }; private static string\[\] arabicDigits = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" }; public static string ArabicToChinese(int number) { string chineseNumber = ""; string numberString = number.ToString(); foreach (char digit in numberString) { int digitValue = int.Parse(digit.ToString()); chineseNumber += chineseDigits\[digitValue\]; } return chineseNumber; } public static int ChineseToArabic(string chineseNumber) { string numberString = ""; foreach (char digit in chineseNumber) { int digitIndex = Array.IndexOf(chineseDigits, digit.ToString()); numberString += arabicDigits\[digitIndex\]; } return int.Parse(numberString); } } // 示例用法 int arabicNumber = 12345; string chineseNumber = ChineseNumberConverter.ArabicToChinese(arabicNumber); Console.WriteLine(chineseNumber); // 输出:一二三四五 string chineseNumber = "一二三四五"; int arabicNumber = ChineseNumberConverter.ChineseToArabic(chineseNumber); Console.WriteLine(arabicNumber); // 输出:12345 ``` 请注意,以上示例代码仅演示了基本的转换方法,实际应用中可能需要根据具体需求进行适当的修改和扩展。 #### 引用[.reference_title] - *1* [C# 实现阿拉伯数字转换为中文数字3种实现思路(递归拼接、循环拼接、if拼接)](https://blog.csdn.net/qq_38974638/article/details/108476401)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [汉语数字转换阿拉伯数字](https://blog.csdn.net/ggggwhw/article/details/119961135)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insert_down1,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ggggwhw

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

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

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

打赏作者

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

抵扣说明:

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

余额充值