[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理把中文数字转阿拉伯数字(0~2147483647)

本帖最后由 aloha20200628 于 2024-3-27 11:08 编辑

第一段是测试代码
第二个封装函数/子过程,是母函数 - 分段求和函数
第三个是封装函数/子过程,是子函数 - 最小段位转换函数
  1. @echo off &setlocal enabledelayedexpansion
  2. :[Loop] // 测试代码》中文数字转为阿拉伯数字(0-2147483647)
  3. set "cn="
  4. set/p cn="输入一个中文数字【零 - 二十一亿四千七百四十八万三千六百四十七】:"
  5. if not defined cn endlocal&exit/b
  6. (call :ChangeCnToAn !cn! an)
  7. echo,n=!an!
  8. goto [Loop]
  9. :: 分段求和函数》最大输出范围={ 0~2147483647 }
  10. :ChangeCnToAn // %1=中文数字符串(实值) %2=返回值变量名
  11. if "%~1"=="零" (set "%~2=0")&exit/b
  12. set "#cn#=%~1" &set "Yn=100000000"
  13. if "!#cn#:~-1!"=="亿" (
  14.     (call :ChangeCnToAn9999 !#cn#:~,-1! #n)
  15.     (set/a "%~2=!#n!*!Yn!")&exit/b
  16. )
  17. set "#cn#=!#cn#:*亿=!" &set "#cn=!#cn#:零=!"
  18. if "!#cn:万=!" neq "!#cn!" (for /f "tokens=1-2 delims=万" %%a in ("!#cn!") do (
  19.     (call :ChangeCnToAn9999 %%a nL)
  20.     set/a "#n=!nL!*10000"
  21.     if "%%b" neq "" (
  22.         (call :ChangeCnToAn9999 %%b nR)
  23.         set/a "#n+=!nR!"
  24.     )
  25. )) else (call :ChangeCnToAn9999 !#cn! #n)
  26. if "!#cn#!" neq "%~1" for /f "tokens=1-2 delims=亿" %%a in ("%~1") do (
  27.     (call :ChangeCnToAn9999 %%a nY)
  28.     (set/a "#n+=!nY!*!Yn!")
  29. )
  30. set "%~2=!#n!" &exit/b
  31. :: 最小段位转换函数》输出范围={ 0~9999 }
  32. :ChangeCnToAn9999 // %1=中文数字符串(实值) %2=返回值变量名
  33. if "%~1"=="零" set "%~2=0"&exit/b
  34. set "cn#=%~1"&set "cn#=!cn#:零=!"&set "uList=十,百,千"
  35. set/a "n#=0,一=1,二=2,三=3,四=4,五=5,六=6,七=7,八=8,九=9,十=10,百=100,千=1000"
  36. for /L %%k in (0, 2, 6) do if "!cn#:~%%k,1!" neq "" (
  37.     set "n2c=!cn#:~%%k,2!" &set "nc1=!n2c:~0,1!" &set "nc2=!n2c:~1,1!"
  38.     if "!nc2!"=="" (set/a n#+=!nc1!) else for %%c in (!nc2!) do (
  39.         if "!uList:%%c=!" neq "!uList!" (set/a n#+=!nc1!*!nc2!) else (set/a n#+=!nc1!+!nc2!)
  40.     )
  41. )
  42. set "%~2=!n#!" &exit/b
复制代码
2

评分人数

中文数字的单位字符只针对》零十百千万亿,未考虑繁体字如 佰...

TOP

回复 13# hfxiang

中文数字的输入格式应为中文小写格式》亿万千百十...而佰须改为百

TOP

回复 15# hfxiang

中文数字大小写混合输入的问题,其实可用一个前置字典替换解决。此处不再复贴一楼全版代码了,有需求者可将如下代码行插入一楼代码第5行之后即可。
  1. for %%v in ("壹=一", "贰=二", "叁=三", "肆=四", "伍=五", "陆=六", "柒=七", "捌=八", "玖=九", "拾=十", "佰=百", "仟=千") do (set "cn=!cn:%%~v!")
复制代码

TOP

回复 17# hfxiang

只要能经受各种测试就好...

TOP

返回列表