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

[数值计算] 批处理如何把中文数字转换成阿拉伯数字?

自己写的,谁能帮我简化一下?感觉用4个set和call set部分太重复了。
而且这个只能处理一千以下的。要能处理很大的数,该怎么改进。提提意见啊
1.txt的内容随便写几个:
一百零五
一百二十
九十八


  1. @echo off&setlocal enabledelayedexpansion
  2. set n=0
  3. for %%i in (零 一 二 三 四 五 六 七 八 九 十) do (
  4. set %%i=!n!
  5. set /a n+=1
  6. set /a n=!n! %% 10
  7. )
  8. for /f %%a in (1.txt) do (
  9. set s=%%a
  10. set s1=!s:~0,1!
  11. set s2=!s:~1,1!
  12. set s3=!s:~2,1!
  13. set s4=!s:~3,1!
  14. call set x1=%%!s1!%%
  15. call set x2=%%!s2!%%
  16. call set x3=%%!s3!%%
  17. call set x4=%%!s4!%%
  18. if "!s3!"=="" set x3=
  19. if "!s2!"=="百" (set x=!x1!!x3!!x4!) else (set x=!x1!!x3!)
  20. echo !x!
  21. )
  22. pause
复制代码

开始没有仔细看清贴子内容,导致疏忽了问题的严重性,这篇跟贴回答有误,我把它编辑掉。
处理亿位数字请见6楼 batman 的代码。

[ 本帖最后由 foxJL 于 2009-11-11 00:57 编辑 ]

TOP

刚刚意识到问题的恐怖
不是一二三=123
而是一二三=1百2十3...

[ 本帖最后由 canyuexiaolang 于 2009-11-10 19:44 编辑 ]

TOP

回复 3楼 的帖子

楼主:中文数字转换成阿拉伯数字

就算是阿拉伯数字转换成中文数字,你这个也不对,123是“一百二十三”,而不是“一二三”

=========================================
为什么我的网络延迟总是这么大?打开帖子时3楼内容没有改,一发表就看到改了?我回复时间不超过一分钟。
好几次碰到这种情况。

[ 本帖最后由 zqz0012005 于 2009-11-10 19:52 编辑 ]
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

原帖由 canyuexiaolang 于 2009-11-10 19:38 发表
刚刚意识到问题的恐怖
不是一二三=123
而是一二三=1百2十3...

确实值得思考。

TOP

初看觉得不难,在实际编写中遇到了不少问题,也反复编写了几次。
因cmd最大能处理的数值是亿位,所以代码只考虑到亿位数值:
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (一 二 三 四 五 六 七 八 九) do set /a n+=1&set "_%%a=!n!"
  3. for %%a in (十-0 百-00 千-000 亿-00000000) do (
  4.     for /f "tokens=1,2 delims=-" %%a in ("%%a") do set "_%%a=%%b"
  5. )
  6. for /f "delims=" %%a in (a.txt) do (
  7.     set /a num=0&set "str=%%a"
  8.     set "str=!str:零=!"
  9.     for %%a in (亿 万 千 百 十) do if "!str:%%a=!" neq "!str!" call :lp %%a
  10.     set /a num+=_!str!&echo !num!
  11. )
  12. pause>nul&goto :eof
  13. :lp
  14. if %1 neq 万 (
  15.    for /f "tokens=1* delims=%1" %%a in ("%str%") do set /a num+=!_%%a!!_%1!&set "str=%%b"
  16.    ) else (
  17.    for /f "tokens=1,2 delims=万" %%a in ("!str!") do set "var=%%a"&set "str=%%b"
  18.    for %%a in (千 百 十) do if "!var:%%a=!" neq "!var!" call :loop %%a
  19.    set /a num+=_!var!*10000
  20. )
  21. goto :eof
  22. :loop
  23. for /f "tokens=1* delims=%1" %%a in ("%var%") do set /a num+=!_%%a!!_%1!0000&set "var=%%b"   
复制代码
测试文本a.txt如下:
  1. 一千零二十二万零四十九
  2. 二亿二千二百二十二万二千二百二十四
  3. 四十三
  4. 五百零九
  5. 二百七十一
  6. 一千零二
  7. 五千零八十六
  8. 二千九百零三
  9. 三千四百五十五
  10. 九十九
  11. 三百零九万零七十
  12. 九亿零三
复制代码

[ 本帖最后由 batman 于 2009-11-11 00:01 编辑 ]
1

评分人数

    • foxJL: 我也是,开始觉得是小问题,仔细看了才知道 ...PB + 10
***共同提高***

TOP

嘿嘿嘿,用输入法实现
命令行参考:hh.exe ntcmds.chm::/ntcmds.htm
求助者请拿出诚心,别人才愿意奉献热心!
把查看手册形成条件反射!

TOP

楼上的兄弟你又看错了,是从中文换成数字。

TOP

返回列表