标题: [文本处理] [代码征集]批处理人民币金额小写转大写 [打印本页]
作者: foxJL 时间: 2008-3-10 17:05 标题: [代码征集]批处理人民币金额小写转大写
样式如:
123456.32
壹拾贰万叁仟肆佰伍拾陆元叁角贰分
要求:代码越简洁越好。
大写数字:零壹贰叁肆伍陆柒捌玖拾
单位:拾佰仟万亿
作者: youxi01 时间: 2008-3-10 17:41
呵呵
看看各位再写出来的代码从效率和精简度上面有没有突破?
作者: foxJL 时间: 2008-3-10 17:48
原帖由 youxi01 于 2008-3-10 17:41 发表
呵呵
看看各位再写出来的代码从效率和精简度上面有没有突破?
正是这个意思,希望都来参与.
作者: 随风 时间: 2008-3-11 13:19
:: 人民币金额小写转大写
::dos联盟里早以有经典代码了。
::实在想不出比他更精简的代码,本想精简一下他的代码,结果发现越减越多。
::也发出来吧,算是给论坛添一块砖。
::以下代码前半部分出自dos联盟的 qzwqzw
::http://www.cn-dos.net/forum/view ... =%E5%A4%A7%E5%86%99
:- @echo off
- set tbl1=零壹贰叁肆伍陆柒捌玖
- set tbl2=分角元拾佰仟万拾佰仟亿拾佰仟
- :test
- setlocal EnableDelayedExpansion&cls
- set /p num=请输入金额(小于一万亿元)
- echo\&echo 小写 %num%&echo\
- for /f "tokens=1,2 delims=." %%f in ("%num%") do (
- set num2=%%g00
- set num=%%f!num2:~0,2!
- )
- :loop
- call set rmb=%%tbl1:~%num:~-1,1%,1%%%%tbl2:~%bit%,1%% %rmb%
- set /a bit+=1
- set num=%num:~0,-1%
- if not "%num%"=="" goto loop
- rem 以上代码原创作者 qzwqzw 出自 cn-dos 联盟
- rem 地址:http://www.cn-dos.net/forum/viewthread.php?tid=26230&fpage=1&highlight=%E5%A4%A7%E5%86%99
- for /f "tokens=1-3 delims=亿万" %%a in ("%rmb%") do (
- if not "%%c"=="" (
- call :lis "%%a" 亿
- call :lis "%%b" 万
- call :lis "%%c"
- ) else (
- if not "%%b"=="" (
- call :lis "%%a" 万
- call :lis "%%b"
- ) else call :lis "%%a"
- ))
- if "!rm:~-1!"=="元" (set rm=!rm!整) else set rm=!rm:元=元零!
- set rm=!rm:零零=零!
- echo 大写 !rm!
- echo\&pause
- endlocal
- goto :test
- :lis
- set str=
- for %%i in (%~1) do (
- set var=%%i
- set var=!var:零元=元!
- if "!var:~0,1!"=="零" (set str=!str!零) else set str=!str!%%i
- set str=!str:零零=零!&set str=!str:零元=元!
- )
- if "!str:~-1!"=="零" set str=!str:~0,-1!
- if not "!str!"=="" set rm=!rm!!str!%~2
- goto :eof
复制代码
[ 本帖最后由 随风 于 2008-3-11 15:07 编辑 ]
作者: foxJL 时间: 2008-3-14 19:45
正如随风大哥所说越精简越麻烦,到最后还是一堆转换简化不了.
代码给大家作参考,期待更好的代码!- @echo off&setlocal enabledelayedexpansion
- set capital=零壹贰叁肆伍陆柒捌玖
- set unit=分角元拾佰仟万拾佰仟亿拾佰仟万
- set /p num=输入需转换的金额:
- for /f "tokens=1,2 delims=." %%i in ("%num%") do (set int=%%i&set dec=%%j00)
- set num=%int%%dec:~0,2%
- for /l %%i in (0,1,15) do (call set num=%%num:%%i= !capital:~%%i,1!%%)
- for %%i in (%num%) do (set nums=%%i !nums!)
- for %%i in (%nums%) do (call set en=%%i%%unit:~!n!,1%%!en!&set /a n+=1)
- for %%i in (零拾,零佰,零仟,零零,零零) do set en=!en:%%i=零!
- (set en=!en:零万=万!)&(set en=!en:零亿=亿!)&(set en=!en:亿万=亿!)
- (set en=!en:零元=元!)&(set en=!en:零角零分=整!)&(set en=!en:零分=!)
- echo %en%
- pause>nul
复制代码
[ 本帖最后由 foxJL 于 2008-3-15 12:14 编辑 ]
[ 本帖最后由 foxJL 于 2009-11-11 16:19 编辑 ]
作者: 随风 时间: 2008-3-15 07:46
回 5 楼 输入一亿 显示:壹亿万零整
作者: foxJL 时间: 2008-3-15 12:16
原帖由 随风 于 2008-3-15 07:46 发表
回 5 楼 输入一亿 显示:壹亿万零整
多谢!代码已经更新了.
作者: radem 时间: 2009-11-17 21:57
for %%i in (零拾,零佰,零仟,零零,零零) do set en=!en:%%i=零!
改为:
for %%i in (零拾,零佰,零仟,零角,零零,零零) do set en=!en:%%i=零!
作者: radem 时间: 2009-11-17 22:54
对5楼加了判断:
- @echo off&setlocal enabledelayedexpansion
- set capital=零壹贰叁肆伍陆柒捌玖
- set unit=分角元拾佰仟万拾佰仟亿拾佰仟万
- set /p num=输入需转换的金额(不超过万亿元):
- for /f "tokens=1,2 delims=." %%i in ("%num%") do (set int=%%i&set dec=%%j00)
- if not "%int:~13%$" == "$" echo 靠!你太高估我的能力啦!&pause>nul&goto :eof
- set num=%int%%dec:~0,2%
- for /l %%i in (0,1,15) do (call set num=%%num:%%i= !capital:~%%i,1!%%)
- for %%i in (%num%) do (set nums=%%i !nums!)
- for %%i in (%nums%) do (call set en=%%i%%unit:~!n!,1%%!en!&set /a n+=1)
- for %%i in (零拾,零佰,零仟,零角,零零,零零) do set en=!en:%%i=零!
- (set en=!en:零万=万!)&(set en=!en:零亿=亿!)&(set en=!en:亿万=亿!)
- (set en=!en:零元=元!)&(set en=!en:零角零分=整!)&(set en=!en:零分=!)
- echo %en%
- pause>nul
复制代码
作者: netbenton 时间: 2009-11-18 13:30
学习之后再减减,不过好像少不了多少了。。。
- @echo off&setlocal enabledelayedexpansion
- set capital=零壹贰叁肆伍陆柒捌玖
- set unit=仟佰拾万仟佰拾亿仟佰拾万仟佰拾元角分
- set n=0&set en=
- set /p num=输入需转换的金额(不超过万亿元):
- set int=%num:.=&set dec=%
- set dec=!dec!00
- set num=!int!!dec:~0,2!
- if not "%int:~16%$" == "$" echo 靠!你太高估我的能力啦!&pause>nul&goto :eof
- for /l %%i in (-1,-1,-18) do (
- for /f %%a in ("!num:~%%i,1!") do (
- set en=!capital:~%%a,1!!unit:~%%i,1!!en!
- )
- if "!num:~%%i!" equ "!num!" goto :ok
- )
- :ok
- set en=!en:零角零分=整!
- for %%i in (拾,佰,仟,角,零,零) do set en=!en:零%%i=零!
- for %%i in (亿,万,元) do set en=!en:零%%i=%%i!
- set en=!en:零分=!&set en=!en:亿万=亿!
- echo %en%
- pause
复制代码
作者: semiuel 时间: 2009-11-18 14:12
9楼和10楼代码不能处理0.01元
[ 本帖最后由 semiuel 于 2009-11-18 14:13 编辑 ]
作者: netbenton 时间: 2009-11-18 18:43
11楼一句话,又多了两句代码:
- @echo off&setlocal enabledelayedexpansion
- set capital=零壹贰叁肆伍陆柒捌玖
- set unit=仟佰拾万仟佰拾亿仟佰拾万仟佰拾元角分
- set n=0&set en=
- set /p num=输入需转换的金额(不超过千万亿元):
- set int=%num:.=&set dec=%
- set dec=!dec!00
- set num=!int!!dec:~0,2!
- if not "%int:~16%$" == "$" echo 靠!你太高估我的能力啦!&pause>nul&goto :eof
- for /l %%i in (-1,-1,-18) do (
- for /f %%a in ("!num:~%%i,1!") do (
- set en=!capital:~%%a,1!!unit:~%%i,1!!en!
- )
- if "!num:~%%i!" equ "!num!" goto :ok
- )
- :ok
- set en=@!en:零角零分=整!
- for %%i in (拾,佰,仟,角,零,零) do set en=!en:零%%i=零!
- for %%i in (亿,万,元) do set en=!en:零%%i=%%i!
- set en=!en:零分=!&set en=!en:亿万=亿!&set en=!en:@元=@!&set en=!en:@零=@!
- echo %en:@=%
- pause
复制代码
作者: semiuel 时间: 2009-11-18 22:15
楼上辛苦了.考虑到很多使用这个批处理的朋友的目的不是为了看,而是为了输入,所以我在批处理最后PAUSE的前面加了两句.- mshta vbscript:clipboarddata.setdata("text","%en:@=%")(close)
- echo 转换结果已存入剪贴板
复制代码
作者: HAT 时间: 2015-5-14 11:46
- ::code by youxi01@cn-dos.net
- ::date 2006-1-1(Happy new year!best wishes to everyone!)
- @echo off
- setlocal enabledelayedexpansion
- set /a a=0,b=0,c=0
-
- ::================================
- ::设置单位名称;
- SET NAME0=仟
- SET NAME1=佰
- SET NAME2=拾
- SET NAME3=
- ::================================
-
- ::=============================================
- ::设置数字对应的大写中文汉字
- for %%i in (零 壹 贰 叁 肆 伍 陆 柒 捌 玖) do (
- set BIG!a!=%%i
- set /a a+=1)
- ::=============================================
-
- ::=======================================================================
- ::在以下“函数”的处理过程中,要用到"#"对数字进行对齐(都成四位),以便截取;
- ::这里设置凡是出现"#"的地方都设置为空。
- set BIG#=
- ::=======================================================================
-
- set EN=
-
- ::====================================================
- ::这里对输入的数字进行处理,分别取出整数部分和小数部分;
-
- set /p EN=请输入金钱数(1000亿以内):
- for /f "tokens=1,2* delims=." %%i in ("%EN%") do (
- set "round=%%i"
- set "dec=%%j00" 2>nul)
- ::=====================================================
- set /a round=%round:,=%
- set dec=%dec:~0,2%
-
- :test
- set /a b+=1
- ::=============================================
- ::每四位数字为一组,对原来的数据进行截取;
- if %round% gtr 9999 (
- set num!b!=!round:~-4!
- set round=!round:~0,-4!
- goto :test) else set num!b!=!round!
- ::==============================================
-
- ::=====================================================
- ::分别对1、2、3段数据进行处理;分别赋予单位:元、万、亿
- ::同时,分别将返回的数据传给str1,str2,str3(利用%3来控制)。
- call :test1 %num1% 元 1
- call :test1 %num2% 万 2
- call :test1 %num3% 亿 3
- ::======================================================
-
- ::====================================================================
- ::去掉数字大写里多余的"零"。比如,1002,处理后读出来为:"壹千零贰元整"
- ::符合我们中国人一般的读数方法;同时将结果分别传入str1,str2,str3(%2控制)。
- call :test2 %str1% 1
- call :test2 %str2% 2
- call :test2 %str3% 3
- ::=====================================================================
-
- ::==============================================================
- ::防止类似2,0000,1002.00形式出现错误(错误读为:2亿万1千零2元整)
- if "!str2!"=="零万" set str2=零
- ::===============================================================
-
- set str=%str3%%str2%%str1%
- set str=%str:零元=元%
- set str=%str:零万=万%
- set str=%str:零亿=亿%
-
- ::防止整数部分为0;
- if "%str%"=="元" set str=零元
-
- ::对小数部分数字进行处理;
- if "%dec%"=="00" (set dec=整) else (
- set /a dec1=!dec:~0,1!
- set /a dec2=!dec:~1,1!
- if !dec1! EQU 0 (set dec1=零) else call set dec1=%%BIG!dec1!%%角
- if !dec2! EQU 0 (set dec2=) else call set dec2=%%BIG!dec2!%%分
- set dec=!dec1!!dec2!
- )
- echo.
- echo ========================
- echo 你输入的金钱数目大写为:
- echo.
- echo %str:零零=零%%dec%
- echo ========================
- pause>nul
-
- :test1
- if not "%1"=="" (
- set temp=####%1
- set temp=!temp:~-4!
- for /l %%i in (0 1 3) do (
- set tmp%%i=!temp:~%%i,1!
- if defined tmp%%i (
- if !tmp%%i! GTR 0 (call set str%3=!str%3!%%BIG!tmp%%i!%%!NAME%%i!) else (
- call set str%3=!str%3!%%BIG!tmp%%i!%%)))
- set str%3=!str%3!%2
- ) else set str%3=
- goto :eof
-
- :test2
- set tmp=%1
- set tmp=%tmp:零零=零%
- set str%2=%tmp:零零=零%
复制代码
原始出处 http://www.cn-dos.net/forum/viewthread.php?tid=26230#pid162959
作者: HAT 时间: 2015-5-14 16:07
- :: 人民币金额小写转大写
- :: qzwqzw@bbs.cn-dos.net
- :: 2007-01-01
- @echo off
- setlocal EnableDelayedExpansion
-
- set tbl1=零壹贰叁肆伍陆柒捌玖
- set tbl2=分角元拾佰仟万拾佰仟亿拾佰仟
-
- :test
- cls
- setlocal
- set /p num=请输入小写金额(小于一万亿元,直接回车退出):
- if "%num%"=="" goto :eof
-
- set num=%num:,=%
- set num=0%num%
-
- for /f "tokens=1,2,* delims=." %%f in ("%num%") do (
- set num2=%%g00
- set num=%%f!num2:~0,2!
- if not "%%h"=="" goto :error
- )
-
- :del_pre0
- if not "%num:~0,1%"=="0" goto checknum
- set num=%num:~1%
- goto del_pre0
-
- :checknum
- set /a num2=num+0
- if "%num%"=="%num2%" goto loop
-
- :error
- echo.
- echo 输入小写金额无效!
- echo.
- pause
- goto test
-
- :loop
- call set rmb=%%tbl1:~%num:~-1,1%,1%%%%tbl2:~%bit%,1%%%rmb%
- set /a bit+=1
- set num=%num:~0,-1%
- if not "%num%"=="" goto loop
-
- set rmb=%rmb:零拾=零%
- set rmb=%rmb:零佰=零%
- set rmb=%rmb:零仟=零%
- set rmb=%rmb:零零=零%
- set rmb=%rmb:零零=零%
-
- set rmb=%rmb:零元=元零%
- set rmb=%rmb:零万=万零%
- set rmb=%rmb:零亿=亿零%
- set rmb=%rmb:零零=零%
-
- set rmb=%rmb:零分=零%
- set rmb=%rmb:零角=零%
- set rmb=%rmb:角零=角%
- set rmb=%rmb:零零=整%
-
- echo.
- echo 人民币%rmb%
- echo.
- pause
- endlocal
- goto test
复制代码
原始出处 http://www.cn-dos.net/forum/viewthread.php?tid=26230#pid163016
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |