标题: [数值计算] 批处理如何把中文数字转换成阿拉伯数字? [打印本页]
作者: wnc1988 时间: 2009-11-10 16:23 标题: 批处理如何把中文数字转换成阿拉伯数字?
自己写的,谁能帮我简化一下?感觉用4个set和call set部分太重复了。
而且这个只能处理一千以下的。要能处理很大的数,该怎么改进。提提意见啊
1.txt的内容随便写几个:
一百零五
一百二十
九十八
五
- @echo off&setlocal enabledelayedexpansion
- set n=0
- for %%i in (零 一 二 三 四 五 六 七 八 九 十) do (
- set %%i=!n!
- set /a n+=1
- set /a n=!n! %% 10
- )
-
- for /f %%a in (1.txt) do (
- set s=%%a
- set s1=!s:~0,1!
- set s2=!s:~1,1!
- set s3=!s:~2,1!
- set s4=!s:~3,1!
- call set x1=%%!s1!%%
- call set x2=%%!s2!%%
- call set x3=%%!s3!%%
- call set x4=%%!s4!%%
- if "!s3!"=="" set x3=
- if "!s2!"=="百" (set x=!x1!!x3!!x4!) else (set x=!x1!!x3!)
- echo !x!
- )
- pause
复制代码
作者: foxJL 时间: 2009-11-10 16:53
开始没有仔细看清贴子内容,导致疏忽了问题的严重性,这篇跟贴回答有误,我把它编辑掉。
处理亿位数字请见6楼 batman 的代码。
[ 本帖最后由 foxJL 于 2009-11-11 00:57 编辑 ]
作者: canyuexiaolang 时间: 2009-11-10 19:38
刚刚意识到问题的恐怖
不是一二三=123
而是一二三=1百2十3...
[ 本帖最后由 canyuexiaolang 于 2009-11-10 19:44 编辑 ]
作者: zqz0012005 时间: 2009-11-10 19:49 标题: 回复 3楼 的帖子
楼主:中文数字转换成阿拉伯数字
就算是阿拉伯数字转换成中文数字,你这个也不对,123是“一百二十三”,而不是“一二三”
=========================================
为什么我的网络延迟总是这么大?打开帖子时3楼内容没有改,一发表就看到改了?我回复时间不超过一分钟。
好几次碰到这种情况。
[ 本帖最后由 zqz0012005 于 2009-11-10 19:52 编辑 ]
作者: foxJL 时间: 2009-11-10 20:15
原帖由 canyuexiaolang 于 2009-11-10 19:38 发表
刚刚意识到问题的恐怖
不是一二三=123
而是一二三=1百2十3...
确实值得思考。
作者: batman 时间: 2009-11-10 23:59
初看觉得不难,在实际编写中遇到了不少问题,也反复编写了几次。
因cmd最大能处理的数值是亿位,所以代码只考虑到亿位数值:- @echo off&setlocal enabledelayedexpansion
- for %%a in (一 二 三 四 五 六 七 八 九) do set /a n+=1&set "_%%a=!n!"
- for %%a in (十-0 百-00 千-000 亿-00000000) do (
- for /f "tokens=1,2 delims=-" %%a in ("%%a") do set "_%%a=%%b"
- )
- for /f "delims=" %%a in (a.txt) do (
- set /a num=0&set "str=%%a"
- set "str=!str:零=!"
- for %%a in (亿 万 千 百 十) do if "!str:%%a=!" neq "!str!" call :lp %%a
- set /a num+=_!str!&echo !num!
- )
- pause>nul&goto :eof
- :lp
- if %1 neq 万 (
- for /f "tokens=1* delims=%1" %%a in ("%str%") do set /a num+=!_%%a!!_%1!&set "str=%%b"
- ) else (
- for /f "tokens=1,2 delims=万" %%a in ("!str!") do set "var=%%a"&set "str=%%b"
- for %%a in (千 百 十) do if "!var:%%a=!" neq "!var!" call :loop %%a
- set /a num+=_!var!*10000
- )
- goto :eof
- :loop
- for /f "tokens=1* delims=%1" %%a in ("%var%") do set /a num+=!_%%a!!_%1!0000&set "var=%%b"
复制代码
测试文本a.txt如下:- 一千零二十二万零四十九
- 二亿二千二百二十二万二千二百二十四
- 一
- 四十三
- 五百零九
- 二百七十一
- 一千零二
- 五千零八十六
- 二千九百零三
- 三千四百五十五
- 九十九
- 三百零九万零七十
- 九亿零三
复制代码
[ 本帖最后由 batman 于 2009-11-11 00:01 编辑 ]
作者: zqz0012005 时间: 2009-11-11 02:10
嘿嘿嘿,用输入法实现
作者: foxJL 时间: 2009-11-11 13:59
楼上的兄弟你又看错了,是从中文换成数字。
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |