中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-15 12:28
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » [共同参与][挑战思路]中文数字阿拉伯化
可打印版本  6,807 / 11
第1楼 namejm 发表于 2007-01-03 12:18
荣誉版主 发帖 1,737 积分 5,226 来自 成都
[共同参与][挑战思路]中文数字阿拉伯化
  头两天,无奈何 兄提出了把小写的金额转化为大写的想法:批处理实现数字金额转大写,引来了不少高手,其中的解法让人大开眼界。

  qzwqzw 兄提出了逆向转换的想法,觉得很有意思,尝试着写了段代码,没有错误检测语句,也没有去做代码精简的工作,发出来让大家测试一下,也希望各位能提供不同的解法:


[ Last edited by namejm on 2007-1-3 at 08:18 PM ]
第2楼 qzwqzw 发表于 2007-01-03 23:23
银牌会员 发帖 636 积分 2,343
你的代码用捌仟零叁万测试有问题,具体在哪自己找找吧
————————————————————————————————
另发一段完整的互转代码

测试中有意加了一些无效数字

RMB2Num段我很不满意

一者没有良好的检查,findtsr 不支持双字节字符的正则

二者没有良好的结构,算法和数据结构的设计缺陷,导致代码结构的缺陷



[ Last edited by qzwqzw on 2007-1-3 at 11:22 AM ]
第3楼 namejm 发表于 2007-01-04 00:10
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  呵呵,测试不严谨,正在查错。
第4楼 qzwqzw 发表于 2007-01-04 00:30
银牌会员 发帖 636 积分 2,343
R3仅是将RMB2Num段的结构作了调整

因为算法和数据结构未变

所以一些固有缺陷仅仅转变了表现方式

比如嵌套的if、冗余的else set等

[ Last edited by qzwqzw on 2007-1-3 at 11:34 AM ]
第5楼 namejm 发表于 2007-01-04 01:58
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  经过修改,顶楼代码已经能处理形如 捌仟零叁万、捌仟零叁拾万 之类的中文数字(感谢 qzwqzw 在 2F 和 6F 指出这些问题),请各位继续测试。

RE qzwqzw:

  如果能把解题思路放在代码里的话,就能让别人容易理解你的算法了——开始硬着头皮看你的代码-_-||。

[ Last edited by namejm on 2007-1-3 at 03:10 PM ]
第6楼 qzwqzw 发表于 2007-01-04 02:32
银牌会员 发帖 636 积分 2,343
继续用捌仟零叁拾万测试出现问题

————————————————————————————————

在我的代码里

:Num2RMB 段比较简单,直接按位替换数字和进位后,再针对零整问题分步替换

:RMB2Num 段比较麻烦,因为算法上并不成熟,所以不想多做说明

主要是对tbl2与rmb进行同步扫描

两者对齐时进行数字替换并同步移位

否则单独移位%tbl2%使之对齐,同时用0补空位

代码本身已大体反映了算法的轮廓

可能我的注释反而会加大阅读上的障碍,所以一概略去

一句清晰的代码胜过十句模糊的注释
第7楼 namejm 发表于 2007-01-04 04:07
荣誉版主 发帖 1,737 积分 5,226 来自 成都
RE qzwqzw:

  一段代码确实不需要过多的注释,但是,如果能把思路一并附上的话,则效果更好,因为思路的说明信息能让人从一开始就知道这个代码的大致流程,当代码过多的时候,不至于跳转得晕头转向而忘记了每节代码的目的。

  当然,提供思路说明信息只是为了能让别人更好地理解代码,是为了方便他人,不是必需的内容。
第8楼 youxi01 发表于 2007-01-04 07:45
高级用户 发帖 247 积分 846 来自 湖南==》广东
来个"另类"点的吧,目前只支持1亿以内的数字,欢迎测试!

第9楼 tigerpower 发表于 2007-01-04 10:48
中级用户 发帖 99 积分 377
哈哈,偶难得写这么长的纯批处理:)
@echo off
set USAGE=USAGE: %0 hanzi
setlocal enabledelayedexpansion
set daxie=零壹贰叁肆伍陆柒捌玖
for /l %%a in (0,1,9) do (set Arabic_poi!daxie:~%%a,1!=%%a)
for /l %%a in (0,1,9) do (set Arabic_int!daxie:~%%a,1!=+%%a)
set Arabic_poi点=.
set Arabic_int拾=*10
set Arabic_int佰=*100
set Arabic_int仟=*1000
set Arabic_int万=)*10000
set Arabic_int亿=)*100000000+(0

if "%1"=="" echo %USAGE%&&goto :eof
set input=%1。

set point=0
:loop
if not "!input!"=="" (
set chr=!input:~,1!
if "!chr!"=="点" set point=1
if "!chr!"=="万" set wan=1
if "!chr!"=="亿" set yi=1
if %point%==0 (set int=!int!!Arabic_int%chr%!) else (set poi=!poi!!Arabic_poi%chr%!)
set input=!input:~1!
goto loop)

if not defined int set int=0
if defined wan set int=(!int!
if defined yi (if not defined wan set int=(!int!^)) else set /a int=!int!&&goto end

set int_re=!int:*100000000+=!
set /a int_yi=!int:100000000+%int_re%=1!
set /a int_re=%int_re%
for /l %%i in (0,1,7) do (if "!int_re:~%%i!"=="" set int_re=0!int_re!)
set int=!int_yi!!int_re!

:end
echo %int%%poi%


[ Last edited by tigerpower on 2007-1-6 at 12:24 PM ]
第10楼 tao0610 发表于 2007-01-05 08:28
高级用户 发帖 218 积分 579
发一个算术法算出来的.
要小于2147483648,只能是整型
第11楼 vipchenlang 发表于 2007-11-30 23:51
新手上路 发帖 3 积分 6
又长见识了!!!!!!!!!!!!!!!!!!!!!
第12楼 new999 发表于 2008-12-03 18:42
新手上路 发帖 1 积分 1
Originally posted by youxi01 at 2007-1-4 07:45:
来个"另类"点的吧,目前只支持1亿以内的数字,欢迎测试!

[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023