[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]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

评分人数

测试好像不是俺想要的结果?
D:\bat_test>中文数字转阿拉伯数字.bat
输入一个中文数字【零 - 二十一亿四千七百四十八万三千六百四十七】:一万九千七
n=9007

TOP

回复 2# hfxiang
你输入的不规范:一万九千七百

TOP

回复 3# qixiaobin0715


还是不行,测试如下:
输入一个中文数字【零 - 二十一亿四千七百四十八万三千六百四十七】:一万九千七百
n=9701

请展示一下你的规范输入后的测试结果,谢谢

TOP

  1. 输入一个中文数字【零 - 二十一亿四千七百四十八万三千六百四十七】:一万九千七百
  2. n=19700
  3. 输入一个中文数字【零 - 二十一亿四千七百四十八万三千六百四十七】:一百零一
  4. n=101
  5. 输入一个中文数字【零 - 二十一亿四千七百四十八万三千六百四十七】:一亿零二十万零伍佰零一
  6. n=100200001
  7. 输入一个中文数字【零 - 二十一亿四千七百四十八万三千六百四十七】:
复制代码

TOP

不知道楼主的规范写法是怎样的?最后一个未通过。

TOP

回复 5# qixiaobin0715


谢谢。从显示上看只有1个不正常。
不知为何,俺测试的好基本上都不正常。估计代码显示到网页后复制到本地时字符有出入。

TOP

回复 7# hfxiang
idwma在此帖中http://bbs.bathome.net/viewthrea ... mp;page=1#pid258116的思路靠谱,分段拼接,可突破字符限制。

TOP

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

TOP

回复 9# aloha20200628
抱歉搞错了!!!

TOP

本帖最后由 qixiaobin0715 于 2022-8-11 09:15 编辑

按照idwma在其它帖子中的思路进行分段拼接,可以突破2147483647的限制,适合小于等于“九千九百九十九亿九千九百九十九万九千九百九十九”的值,再大有点复杂,未加考虑,处理一般情况就足够了:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set str=九千九百九十九亿九千九百九十九万九千九百九十九
  4. set str=!str:零=!
  5. set str=!str:亿=亿 !
  6. set str=!str:万=万 !
  7. set _十=10
  8. for %%i in (一 二 三 四 五 六 七 八 九) do (
  9.     set /a x+=1
  10.     set /a _%%i=!x!
  11.     set y=1
  12.     for %%j in (十 百 千) do (
  13.         set /a y*=10
  14.         set /a _%%i%%j=!x!*!y!
  15.     )
  16. )
  17. for %%i in (!str!) do (
  18.     set Part=%%i
  19.     if !Part:~-1!==亿 (
  20.         set Part1=!Part:~,-1!
  21.     ) else if !Part:~-1!==万 (
  22.         set Part2=!Part:~,-1!
  23.     ) else (
  24.         set Part3=%%i
  25.     )
  26. )
  27. for /l %%i in (1,1,3) do (
  28.     if defined Part%%i (
  29.         set Part%%i=!Part%%i:千=千 !
  30.         set Part%%i=!Part%%i:百=百 !
  31.         set Part%%i=!Part%%i:十=十 !
  32.         for %%j in (!Part%%i!) do set /a m%%i+=_%%j
  33.     )
  34.     set /a m%%i+=10000
  35.     set m%%i=!m%%i:~1!
  36. )
  37. for /f "tokens=* delims=0" %%i in ("!m1!!m2!!m3!") do echo,%%i
  38. pause
复制代码
保存为ANSI编码。
代码是按照一般思路写的,考虑的还不算成熟,应当还有更简洁的方法。

TOP

先以亿分为2段,再将2段以万分别分为2段,总体分为4段,最后拼接,可以扩展为16位数字。

TOP

回复 1# aloha20200628

5楼之前提出的问题还在
  1. 输入一个中文数字【零 - 二十一亿四千七百四十八万三千六百四十七】:一亿零二十万零伍佰零一
  2. n=100200001
复制代码

TOP

回复 13# hfxiang

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

TOP

回复 14# aloha20200628


    之前9楼的回复俺都已看到,但你认为的大写,其在现实应用中是存在的(是俺太不知足了,抱歉)。

TOP

返回列表