ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 8040|回复: 23

[分享] 中文大小写数字转阿拉伯数字

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-3-29 23:05 | 显示全部楼层 |阅读模式
本帖最后由 mzbao 于 2019-3-31 10:36 编辑

前两天看到一个关于“中文大小写数字转阿拉伯数字”的分享贴,发现提供的代码只能转整数,我后面在论坛里搜了一下这方面的帖子,也没有发现特别完善的代码。要不只能转换整数,要不就是只能转换大写人民币。

所以我这两天再考虑能不能把中文大小写数字和大写人民币数字转换阿拉伯数字整合到一个函数里,下面就是这两天的研究成果。我测试了一下,应该算是相对完善了。此函数可以转中文大小写数字(整数和小数都可以)和大写人民币。中文数字的写法接受一定的容错,如果离常规写法实在差太远就没办法了。
中文数字转阿拉伯数字.jpg

中文数字转阿拉伯数字.rar

16.2 KB, 下载次数: 144

评分

7

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-29 23:05 | 显示全部楼层
本帖最后由 mzbao 于 2019-3-29 23:12 编辑

下面是代码;
  1. Public Function CNToNum(sDBNum)
  2. '=============================
  3. '中文大小写转阿拉伯数字函数
  4. '中文大写人民币数字转阿拉伯数字
  5. 'by mzbao
  6. '=============================
  7.     Dim sCNnum$, sCNExp$, ExpArr, temp, i%, sChar$, NumChar$
  8.     Dim m%, n%, rNum%, d%
  9.     Dim LastExp%, Exp%, sFlag$, HasExp As Boolean

  10.     sCNnum = "〇零一二三四五六七八九壹贰叁肆伍陆柒捌玖00123456789123456789"
  11.     sCNExp = ",十,百,千,万,亿,兆,拾,佰,仟,萬,1,2,3,4,8,12,1,2,3,4"
  12.     ExpArr = Split(sCNExp, ",")
  13.    
  14.     For i = 1 To 3
  15.         sDBNum = Replace(sDBNum, Mid("整角分", i, 1), "")
  16.         sDBNum = Replace(sDBNum, Mid("点元圆", i, 1), ".")
  17.         sDBNum = Replace(sDBNum, Mid("○", i, 1), "零")
  18.     Next i
  19.    
  20.     sDBTxt = sDBNum
  21.     For i = Len(sDBTxt) To 1 Step -1
  22.         sChar = Mid(sDBTxt, i, 1)
  23.         m = InStr(sCNnum, sChar)
  24.         If m > 0 Then
  25.             If rNum = 0 Then rNum = i
  26.             If m <= 20 Then
  27.                 NumChar = Mid(sCNnum, m + 20, 1)
  28.             Else
  29.                 NumChar = sChar
  30.             End If
  31.             If HasExp = False Then
  32.                 temp = NumChar & temp
  33.             Else
  34.                 temp = NumChar & Mid(temp, 2)
  35.                 If NumChar = 0 Then temp = 1 & Mid(temp, 2)
  36.             End If
  37.             HasExp = False
  38.             If Exp > LastExp Then LastExp = 0
  39.         Else
  40.             n = InStr(sCNExp, sChar)
  41.             If n > 0 Then
  42.                 Exp = ExpArr(n / 2 + 10)
  43.                 If InStr(",4,8,12,", "," & Exp & ",") Then
  44.                     If LastExp >= Exp Then
  45.                         LastExp = LastExp + Exp: Exp = 0
  46.                     Else
  47.                         LastExp = Exp: Exp = 0
  48.                     End If
  49.                 End If
  50.                 sFlag = String(Exp + LastExp + 1 + d, "0")
  51.                 temp = Format(1 * temp, sFlag)
  52.                 HasExp = True
  53.             End If
  54.             If sChar = "." Then
  55.                 If i < rNum Then d = rNum - i
  56.             End If
  57.         End If
  58.     Next
  59.     If Left(temp, 1) = "0" And Len(temp) > 1 And Len(temp) > d + 1 Then temp = 1 & Mid(temp, 2)

  60.     CNToNum = 1 * temp / 10 ^ d
  61. End Function
复制代码

评分

6

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-3-30 18:06 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-3-30 18:37 来自手机 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-3-30 19:41 | 显示全部楼层
  1. Private Function toNum(myStr)
  2. '==========================================================
  3. '中文小写转阿拉伯数字函数
  4. 'Writen by 时光鸟
  5. '2012-12-24 于 武汉

  6. 'ver 2.0 beta (update 2013-6-17)
  7. '*改进数量级左侧为非转化文本时的转化Bug(感谢excelhome论坛"星语心愿"朋友的反馈)
  8. 'ver 1.9 beta (update 2013-1-12)
  9. '*改进极个别情况最右侧数量级的右侧为非转化文本时的转化Bug
  10. 'ver 1.8 beta (update 2012-12-30)
  11. '*改进少数情况下把"二"习惯用成"两"的时候的转化问题
  12. '*改进极个别情况下"〇"或"零"后直接跟数量级时的转化问题
  13. '*对小部分中文小写数字的不规范表达增加纠错转化功能
  14. '*增加对中文小写乘法口诀转化的功能支持
  15. 'ver 1.7 beta (update 2012-12-29)
  16. '*改进个别情况下需要在中文小写中同时使用〇和零时的转化问题
  17. '*优化代码结构,提升效率
  18. 'ver 1.6 beta (updat'e 2012-12-28)
  19. '*解决了首位只有数量级时这种简化表达方式转化不正确的Bug
  20. 'ver 1.5 beta (update 2012-12-27)
  21. '*解决了〇右侧有多个数量级时某种情况替换数量不正确的Bug
  22. 'ver 1.4 beta (update 2012-12-27)
  23. '*解决了〇右侧有多个数量级时替换数量不正确的Bug
  24. 'ver 1.3 beta (update 2012-12-26)
  25. '*解决了连续有多个数量级时转化不正确的Bug
  26. 'ver 1.2 beta (update 2012-12-26)
  27. '*解决了中文小写中某种情况下使用汉字“零”时转化不正确的Bug
  28. 'ver 1.1 beta (update 2012-12-25)
  29. '*解决了中文小写中含有〇的情况下时转化不正确的Bug
  30. 'ver 1.0 beta (update 2012-12-24)
  31. '*中文小写转阿拉伯数字正常表达方式转化函数发布
  32. '==========================================================

  33. Dim strG$, strL$, strN$, strZ$, findZ$, addZ$
  34. Dim i%, m%, n%, k%, Lv%, Rv%, Lx%, Rx%, R1%, R2%, Ly%, Ry%, Tx%, flagP%
  35. strG = "十百千万亿"
  36. strL = "一二三四五六七八九"
  37. strN = "123456789"
  38. strZ = "〇零"
  39. If myStr = "" Then Exit Function
  40. While (InStr(myStr, Left(strZ, 1)) + InStr(myStr, Right(strZ, 1)) > 0)
  41.     Lv = InStr(myStr, Left(strZ, 1))
  42.     Rv = InStr(myStr, Right(strZ, 1))
  43.     If Lv > 0 Then If Rv = 0 Or Rv > Lv Then findZ = Left(strZ, 1)
  44.     If Rv > 0 Then If Lv = 0 Or Lv > Rv Then findZ = Right(strZ, 1)
  45.     m = InStr(myStr, findZ)
  46.     If m < Len(myStr) And InStr(strG, Mid(myStr, m + 1, 1)) Then
  47.        myStr = Left(myStr, m) & "一" & Mid(myStr, m + 1)
  48.     End If
  49.     If Mid(myStr, m - 1, 1) <> "" Then Lx = InStr(strG, Mid(myStr, m - 1, 1)) Else Lx = 0
  50.     If Mid(myStr, m + 2, 1) <> "" Then R1 = InStr(strG, Mid(myStr, m + 2, 1)) Else R1 = 0
  51.     If Mid(myStr, m + 3, 1) <> "" Then R2 = InStr(strG, Mid(myStr, m + 3, 1)) Else R2 = 0
  52.     If R2 = 5 Then Rx = R1 + R2 + 3 Else Rx = R1 + R2
  53.     If Lx > 0 And Lx < R1 Then Rx = 0
  54.     If Lx > R1 And Lx < R2 Then Rx = R1
  55.     If Lx = 5 Then Lx = Lx + 3
  56.     If Lx = 0 And Rx = 0 Then Lx = 2
  57.     myStr = Replace(myStr, findZ, Mid(10 ^ (Lx - Rx - 1), 2), 1, 1)
  58. Wend
  59. Do
  60.   If Len(myStr) < 2 Then Exit Do
  61.   If Mid(myStr, n + 1, 1) <> "" Then Ly = InStr(strG, Mid(myStr, n + 1, 1)) Else Ly = 0
  62.   If Mid(myStr, n + 2, 1) <> "" Then Ry = InStr(strG, Mid(myStr, n + 2, 1)) Else Ry = 0
  63.   If Ly > 0 And Ry > 0 Then
  64.      If Ly = 5 Then addZ = Mid(10 ^ (Ly + 3), 2) Else addZ = Mid(10 ^ Ly, 2)
  65.      myStr = Left(myStr, n + 1) & addZ & Mid(myStr, n + 2)
  66.      n = n + Len(addZ)
  67.   Else
  68.      n = n + 1
  69.   End If
  70. Loop Until (n = Len(myStr) - 1)
  71. If Len(myStr) > 3 And InStr(strL, Left(myStr, 1)) * InStr(strL, Mid(myStr, 2, 1)) Then
  72.    If Len(myStr) = 4 And Mid(myStr, 3, 1) = "得" Then myStr = Left(myStr, 1) & "×" & Replace(Mid(myStr, 2), "得", "=")
  73.    If Len(myStr) < 6 And InStr(strL, Mid(myStr, 3, 1)) > 0 And InStr(strG, Mid(myStr, 4, 1)) > 0 Then
  74.       myStr = Left(myStr, 1) & "×" & Mid(myStr, 2, 1) & "=" & Mid(myStr, 3)
  75.    End If
  76. End If
  77. If InStr(myStr, "两") > 0 Then myStr = Replace(myStr, "两", "二")

  78. If InStr(strG, Left(myStr, 1)) > 0 Then myStr = "一" & myStr
  79. While (flagP <= Len(myStr) - 2)
  80.   flagP = flagP + 1
  81.   If InStr(strG, Mid(myStr, flagP + 1, 1)) > 0 And InStr(strG & strL & strZ & strN & "1234567890", Mid(myStr, flagP, 1)) = 0 Then
  82.      myStr = Left(myStr, flagP) & "一" & Mid(myStr, flagP + 1)
  83.   End If
  84. Wend

  85. If Len(myStr) > 1 Then
  86.    For i = Len(myStr) - 1 To 1 Step -1
  87.       k = InStr(strG, Right(myStr, 1))
  88.       If k = 5 Then myStr = myStr & Mid(10 ^ (k + 3), 2) Else If k > 0 Then myStr = myStr & Mid(10 ^ k, 2)
  89.       If k = 0 Then
  90.          Tx = InStr(strG, Mid(myStr, i, 1))
  91.          If Tx > 0 And InStr(strL, Mid(myStr, i + 1, 1)) = 0 And Mid(myStr, i + 1, 1) <> "0" Then
  92.             If Tx = 5 Then addZ = Mid(10 ^ (Tx + 3), 2) Else addZ = Mid(10 ^ Tx, 2)
  93.             myStr = Left(myStr, i) & addZ & Mid(myStr, i + 1)
  94.          End If
  95.      End If
  96.    Next i
  97. End If
  98. For i = 1 To Len(strL)
  99.    If i <= Len(strG) And InStr(myStr, Mid(strG, i, 1)) Then myStr = Replace(myStr, Mid(strG, i, 1), "")
  100.    If InStr(myStr, Mid(strL, i, 1)) > 0 Then myStr = Replace(myStr, Mid(strL, i, 1), Mid(strN, i, 1))
  101. Next i
  102. toNum = myStr
  103. End Function
复制代码

Excel [原创]中文小写转阿拉伯数字自定义函数-ExcelVBA程序开发-ExcelHome技术论坛 -  http://club.excelhome.net/thread-974120-1-1.html
时光鸟的作品

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-3-30 20:24 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-31 00:17 | 显示全部楼层
vvw123 发表于 2019-3-30 19:41
Excel [原创]中文小写转阿拉伯数字自定义函数-ExcelVBA程序开发-ExcelHome技术论坛 -  http://club.excel ...

我就是看到你提的这个帖子,这个代码局限性太大,不能识别大写数字,不能识别大写人民币,也没法识别小数位。才让我萌生自己写一个的想法。

TA的精华主题

TA的得分主题

发表于 2019-3-31 08:23 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
mzbao 发表于 2019-3-31 00:17
我就是看到你提的这个帖子,这个代码局限性太大,不能识别大写数字,不能识别大写人民币,也没法识别小数 ...

昨天我也试了,确实如你所说所说,有局限性,例如小数就不能解决。感谢提供代码分享。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-3-31 11:26 | 显示全部楼层
以下代码比前面再稍微简化了一下,总体上一样的。
  1. Public Function CNToNum(sDBNum)
  2. '=============================
  3. '中文大小写转阿拉伯数字函数
  4. '中文大写人民币数字转阿拉伯数字
  5. 'by mzbao
  6. '=============================
  7.     Dim temp, i%, sChar$, rNum%, d%
  8.     Dim LastExp%, Exp%, sFlag$, HasExp As Boolean
  9.    
  10.     For i = 1 To 3
  11.         sDBNum = Replace(sDBNum, Mid("整角分", i, 1), "")
  12.         sDBNum = Replace(sDBNum, Mid("点元圆", i, 1), ".")
  13.         sDBNum = Replace(sDBNum, Mid("○", i, 1), "零")
  14.     Next i
  15.    
  16.     For i = 0 To 9
  17.         sDBNum = Replace(sDBNum, Mid("〇一二三四五六七八九", i + 1, 1), i)
  18.         sDBNum = Replace(sDBNum, Mid("零壹贰叁肆伍陆柒捌玖", i + 1, 1), i)
  19.     Next
  20.    
  21.     sDBTxt = sDBNum
  22.     For i = Len(sDBTxt) To 1 Step -1
  23.         sChar = Mid(sDBTxt, i, 1)
  24.         If IsNumeric(sChar) Then
  25.             If rNum = 0 Then rNum = i
  26.             If HasExp = False Then
  27.                 temp = sChar & temp
  28.             Else
  29.                 temp = sChar & Mid(temp, 2)
  30.                 If sChar = 0 Then temp = 1 & Mid(temp, 2)
  31.             End If
  32.             HasExp = False
  33.             If Exp > LastExp Then LastExp = 0
  34.         Else
  35.             Exp = InStr("十百千万十百千亿十百千兆", sChar)
  36.             If Exp = 0 Then Exp = InStr("拾佰仟萬", sChar)
  37.             If Exp > 0 Then
  38.                  If InStr(",4,8,12,", "," & Exp & ",") Then
  39.                     If LastExp >= Exp Then
  40.                         LastExp = LastExp + Exp: Exp = 0
  41.                     Else
  42.                         LastExp = Exp: Exp = 0
  43.                     End If
  44.                 End If
  45.                 sFlag = String(Exp + LastExp + 1 + d, "0")
  46.                 temp = Format(1 * temp, sFlag)
  47.                 HasExp = True
  48.             End If
  49.             If sChar = "." Then
  50.                 If i < rNum Then d = rNum - i
  51.             End If
  52.         End If
  53.     Next
  54.     If Left(temp, 1) = "0" And Len(temp) > 1 And Len(temp) > d + 1 Then temp = 1 & Mid(temp, 2)

  55.     CNToNum = 1 * temp / 10 ^ d
  56. End Function
复制代码

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-4-4 07:53 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-24 19:24 , Processed in 0.050038 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表