头两天,无奈何 兄提出了把小写的金额转化为大写的想法:批处理实现数字金额转大写,引来了不少高手,其中的解法让人大开眼界。
qzwqzw 兄提出了逆向转换的想法,觉得很有意思,尝试着写了段代码,没有错误检测语句,也没有去做代码精简的工作,发出来让大家测试一下,也希望各位能提供不同的解法:
[ Last edited by namejm on 2007-1-3 at 08:18 PM ]
qzwqzw 兄提出了逆向转换的想法,觉得很有意思,尝试着写了段代码,没有错误检测语句,也没有去做代码精简的工作,发出来让大家测试一下,也希望各位能提供不同的解法:
@echo off
:: Code by JM 2007-1-2~1-3 bbs.cn-dos.net CMD@XP
:: 中文形式数字转换为阿拉伯数字
:: 思路:
:: 先把所有的中文数字转化为前后带空格的阿拉伯数字(零要特殊处理),
:: 然后,把阿拉伯数字从高位到低位逐一提取出来;提取的同时,对"零"做
:: 补位及替换处理,补位的具体规则为:比较"零"前后的进位,补足相应的0,
:: 比如:某个"零"的前后进位分别为"万"和"拾",则这个"零"则替换为两个
:: 连续的0。最后,把所有的空格去掉。
setlocal enabledelayedexpansion
set str=捌仟零叁拾万零柒佰零贰点零伍肆
echo.
echo 要处理的中文数值:%str%
echo --------------------------------------------------
:: 把中文数字转化为阿拉伯数字
for /f "tokens=1* delims=点" %%i in ("%str%") do set var1=%%i&set var2=%%j
call :replace_1 %var1%
set int=%var%
if not "%var2%"=="" (
call :replace_1 %var2%
set dec=!var:零=!
)
echo.
echo 中文数字阿拉伯化的结果1:%int%.%dec%
:: 提取阿拉伯数字
call :pickup %int%
:: 检查原始数值整数部分的最后一位是不是数字,从而决定是否继续转换
if not "%int:~-1%"==" " (
set tmp=!last!
call :replace_2
)
echo.
echo 中文数字阿拉伯化的结果2:%str_%%tmp%.%dec%
if not "%dec%"=="" (
set result=%str_: =%%tmp%.%dec: =%
) else set result=%str_: =%%tmp%
echo.
echo --------------------------------------------------
echo 最终结果是:%result%
endlocal
pause>nul
goto :eof
:pickup
:: 提取阿拉伯数字,并对"零"做处理
set last=%2
if not %1 equ 0 (
set str_=!str_! %1
) else (
set str_=!str_! %zero%
set tmp=
set length=0
)
:: 对"×佰零×"之类的数要单独处理
if "%4"=="零" (
if not "%2"=="佰" (
call :replace %2 %6
) else set zero=0
)
shift
shift
if not "%1"=="" goto pickup
goto :eof
:replace
:: 对"零"做补位处理
if "%2"=="" (
set tmp=
) else (
set tmp=%2
set tmp=!tmp:~0,1!
)
set tmp=%1 %tmp%
call :replace_2
for /f "tokens=1,2" %%i in ("%tmp%") do set former=%%i&set later=%%j
:: 比较字符串 %former% 和 %later% 的长短,不能用 if %former% lss %later% 语句
set flag=!former:%later%=!
if "%flag%"=="%former%" (
set zero=%former:~1%
set flag=
goto :eof
)
:get_length
set /a length+=1
if not "%later%"=="" set later=%later:~0,-1%&goto get_length
set zero=!former:~%length%!
goto :eof
:replace_1
set var=%1
set num=1
for %%i in (壹 贰 叁 肆 伍 陆 柒 捌 玖) do (
call set var=%%var:%%i= !num! %%
set /a num+=1
)
set var=%var:零= 0 零 %
goto :eof
:replace_2
set tmp=%tmp:拾=0%
set tmp=%tmp:佰=00%
set tmp=%tmp:仟=000%
set tmp=%tmp:万=0000%
set tmp=%tmp:亿=00000000%
goto :eof
[ Last edited by namejm on 2007-1-3 at 08:18 PM ]
