中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-14 13:08
47,812 主题排行 / 349,917 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » [共同参与][挑战思路]批处理实现数字金额转大写
可打印版本  14,355 / 24
第1楼 无奈何 发表于 2007-01-01 05:58
荣誉版主 发帖 356 积分 1,338
[共同参与][挑战思路]批处理实现数字金额转大写
  看到坛子里越来越多关于挑战批处理算法的讨论,也涌现出一批热衷于挖掘批处理潜能的兄弟,一些批处理不太适合的工作,也渐由批处理来完成,我很是高兴。
  现拟一题目--数字金额转大写,这个议题在网上几乎可以找到任何流行语言的版本,唯独缺少批处理版的,这个问题当然不能指望老外来做,然后我们再借鉴 ^_^。
规则如下:
1、接收一串金额数字,转为大写,可能出现的合理格式
  为 5821564130 或 5821564.130 或 5,821,564.130 等,
  不会出现格式为 58.215.64.130 等小数位不明的数字或其他非金额数字字符。
2、最大位到千亿即可,最小位到分其后忽略。
3、CMD下纯批处理完成,不使用第三方工具。
4、具体转换依据见附录。

附录:

正确填写票据和结算凭证的基本规定


  银行、单位和个人填写的各种票据和结算凭证是办理支付结算和现金收付的重要依据,直接关系到支付结算的准确、及时和安全。票据和结算凭证是银行、单位和个人凭以记载帐务的会计凭证,是记载经济业务和明确经济责任的一种书面证书。因此,填写票据和结算凭证,必须做到标准化、规范化,要要素齐全、数字正确、字迹清晰、不错漏、不潦草,防止涂改。
  一、中文大写金额数字应用正楷或行书填写,如壹(壹)、贰(貳)、叁(參)、肆(肆)、伍(伍)、陆(陸)、柒、捌、玖、拾、佰、仟、万(萬)、亿、元、角、分、零、整(正)等字样。不得用一、二(两)、三、四、五、六、七、八、九、十、念、毛、另(或0)填写,不得自造简化字。如果金额数字书写中使用繁体字,如贰、陆、亿、万、圆的,也应受理。
  二、中文大写金额数字到“元”为止的,在“元”之后,应写“整”(或“正”)字,在“角”之后可以不写“整”(或“正”)字。大写金额数字有“分”的,“分”后面不写“整”(或“正”)字。
  三、中文大写金额数字前应标明“人民币”字样,大写金额数字有“分”的,“分”后面不写“整”(或“正”)字。
  四、中文大写金额数字前应标明“人民币”字样,大写金额数字应紧接“人民币”字样填写,不得留有空白。大写金额数字前未印“人民币”字样的,应加填“人民币”三字。在票据和结算凭证大写金额栏内不得预印固定的“仟、佰、拾、万、仟、佰、拾、元、角、分”字样。
  五、阿拉伯小写金额数字中有“0”时,中文大写应按照汉语语言规律、金额数字构成和防止涂改的要求进行书写。举例如下:
  (一)阿拉伯数字中间有“0”时,中文大写金额要写“零”字。如¥1,409.50,应写成人民币壹仟肆佰零玖元伍角。
  (二)阿位伯数字中间连续几个“0”时,中文大写金额中间可以只写一个“零”字。如¥6,007.14,应写成人民币陆仟零柒元壹角肆分。
  (三)阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但千位、角位不是“0”时,中文大写金额中可以只写一个零字,也可以不写“零”字。如¥1,680.32,应写成人民币壹仟陆佰捌拾元零叁角贰分,或者写成人民币壹仟陆佰捌拾元叁角贰分;又如¥107,000.53,应写成人民币壹拾万柒仟元零伍角叁分,或者写成人民币壹拾万零柒仟元伍角叁分。
  (四)阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。如¥16,409.02,应写成人民币壹万陆仟肆佰零玖元零贰分;又如¥325.04,应写成人民币叁佰贰拾伍元零肆分。
  五、阿拉伯小写金额数字前面,均应填写人民币符号“¥”(或草写:¥)。阿拉伯小写金额数字要认真填写,不得连写分辩不清。


进制关系表:

┌─┬─┬─┬───┐
│小│简│繁│ 进制 │
├─┼─┼─┼───┤
│一│壹│壹│ 1 │
├─┼─┼─┼───┤
│二│贰│貳│ 2 │
├─┼─┼─┼───┤
│三│叁│叄│ 3 │
├─┼─┼─┼───┤
│四│肆│肆│ 4 │
├─┼─┼─┼───┤
│五│伍│伍│ 5 │
├─┼─┼─┼───┤
│六│陆│陸│ 6 │
├─┼─┼─┼───┤
│七│柒│柒│ 7 │
├─┼─┼─┼───┤
│八│捌│捌│ 8 │
├─┼─┼─┼───┤
│九│玖│玖│ 9 │
├─┼─┼─┼───┤
│十│十│拾│ 10 │
├─┼─┼─┼───┤
│百│佰│佰│ 100 │
├─┼─┼─┼───┤
│千│仟│仟│ 1000 │
├─┼─┼─┼───┤
│万│万│萬│ 10^4 │
├─┼─┼─┼───┤
│亿│亿│億│ 10^8 │
├─┼─┼─┼───┤
│兆│兆│兆│ 10^12│
└─┴─┴─┴───┘

详见:http://wiki.keyin.cn/index.php?title=%E4%B8%AD%E6%96%87%E6%95%B0%E5%AD%97&variant=zh-cn
第2楼 youxi01 发表于 2007-01-01 12:02
高级用户 发帖 247 积分 846 来自 湖南==》广东
写了一段到头来连自己都“看不懂”的代码:


[ Last edited by youxi01 on 2007-1-1 at 11:04 PM ]
第3楼 tigerpower 发表于 2007-01-01 12:43
中级用户 发帖 99 积分 377
哈哈,厉害厉害!!!
去掉空行共63行,不是很长!!!
用纯粹的批处理能写出这样的程序,精彩!!!佩服!!!

美中不足有二:
1. "十"、"百"、"千"应为"拾"、"佰"、"仟",这是语文的问题,应该不算bug:)
2. 当输入是0.xx时好像有点问题。
第4楼 youxi01 发表于 2007-01-01 12:50
高级用户 发帖 247 积分 846 来自 湖南==》广东
谢谢楼上的提醒,已更正!
第5楼 无奈何 发表于 2007-01-01 12:54
荣誉版主 发帖 356 积分 1,338
RE youxi01
兄的代码转换效果非常不错。

初步测试,非常合乎规范要求,加分鼓励。

还有一点建议,帖完整功能的批处理时,推荐属上自己的名字与出处地址等,当多次转贴后,别人发现问题或想与作者交流时不因无处联系作者而苦恼,当然也会更好的保护你的劳动成果。推荐的格式为 作者@论坛 这样的形式,以上只是建议仅供参考。

RE tigerpower
零开头的数字,不为合理的金额,可以忽略,当然去除掉也不是很困难的事。

[ Last edited by 无奈何 on 2007-1-1 at 01:05 PM ]
第6楼 qzwqzw 发表于 2007-01-02 00:23
银牌会员 发帖 636 积分 2,343
凑个热闹吧

采用分步替换的原则,一则简化算法,二则易于控制(比如零元——元零的替换)

特意将兆省略了,因为很少有如此多的人民币金额

而且对于京、兆之类的词汇有多种解释

很多时候一兆等于一百万(1M),也有时候一兆等于一亿亿

另外,有谁有兴趣编个反向转换算法?

以及相关的罗马数字与阿拉伯数字的相互转换?



[ Last edited by qzwqzw on 2007-1-1 at 11:29 AM ]
第7楼 无奈何 发表于 2007-01-02 01:02
荣誉版主 发帖 356 积分 1,338
RE qzwqzw

兄的代码也同样非常出色,并且极其简洁。
金额中含有 “,” 时会出错,“,” 也为合理的金额字符,请稍加完善一下。

兆的概念中国传统和国际单位是不同的,中国传统为一万亿。
详情可以参考下一楼给出的链接。

[ Last edited by 无奈何 on 2007-1-2 at 01:10 AM ]
第8楼 qzwqzw 发表于 2007-01-02 01:28
银牌会员 发帖 636 积分 2,343
加了一些验证代码,很影响代码的简洁,有些郁闷

可以通过带有前缀0的数字,含,的数字,以.前缀的小数

可以禁止含有非法字符的金额
-----------------------------------------------------------------

国际单位的量级是没有兆的,只有m/K/M等

最早是谁将M译为“兆”的已经很难考证

但现在已经很流行,某些会计学教材也开始采用
------------------------------------------------------------------------

至于中国传统的计数,你可以用“亿、兆、京、垓”百度一下
--------------------------------------------------------------------------



[ Last edited by qzwqzw on 2007-1-1 at 12:36 PM ]
第9楼 无奈何 发表于 2007-01-02 12:54
荣誉版主 发帖 356 积分 1,338
RE qzwqzw
简单了解一下,传统的计数以十进制的。上面的表格称作现行通常用的好像比较合适。超大的数字也不太常用,仅当作趣闻知识吧。
第10楼 qzwqzw 发表于 2007-01-03 01:54
银牌会员 发帖 636 积分 2,343
做了一个简单的阿拉伯数字转罗马数字的例子

考虑到规则的不统一和算法的复杂性,没有支持49->IL之类的转化

也没有支持超过4000的数字

反向转换相对困难一些

不过一旦建立了良好的数据结构,算法也就很清晰了



[ Last edited by qzwqzw on 2007-1-2 at 01:17 PM ]
第11楼 HUNRYBECKY 发表于 2007-01-03 02:05
银牌会员 发帖 442 积分 1,179
欣赏大作。
第12楼 tghksj 发表于 2007-01-03 03:26
社区乞丐 发帖 90 积分 -49
怎么又是 qzwqzw

我现在快成了你的FANS了.

你出一段代码,就够我看个一两天的....

老样子加上两分,拿回家看...
第13楼 flamey 发表于 2007-01-03 04:51
初级用户 发帖 74 积分 152
qzwqzw~~~~利害!!!!!
第14楼 qzwqzw 发表于 2007-01-03 23:40
银牌会员 发帖 636 积分 2,343
第15楼 namejm 发表于 2007-01-03 23:47
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  呵呵,qzwqzw 厉害。建议把各种类型的转换开成专帖发表,做到专帖专用,这样有利于日后的深入讨论和论坛的检索。
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023