[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [终极修改版]人民币大写转换.bat

如题!此前我曾发布过一个自己编写的脚本。
http://bbs.bathome.net/thread-70421-1-1.html
那个脚本,当时是我临时编写的(有很多不足和BUG就是了),,,
那类的脚本编写前,我曾偷懒搜索过借鉴过不少,(多数是  FOR /I )而且解构的位数,顶多也就十多万单位还是百万单位来的?忘记了, 就是不足&不满就是了,
但像我这样编写的思路是很少的,至少我玩 脚本十多年,没有人用我这样的思路去解构这样的套路。
所以理论上来说,我觉得这类思路值得新手们去学习和借鉴。
在百度上。如果你搜素  “人民币大写转换 (脚本 & bat & 程序 ) ” 多数会得出很多,不如人意或不理想的脚本和程序,,,
所以,那次我编写了自己的,,初代版本,可以解构51位数值的转换吧,,,
然后在后续使用中,同事和我反馈,一些BUG ,例如:单位结尾出错和连续0的变换,,
尔后,我根据自己当初编写时的思路做了一些完善。,
再到后来,朋友又和我说:希望添加上 角 分 的单位和把结果保存到剪切板。。。
脚本在过年前就写好了!,,
我那思维就这样,很少表达和发布,,,
我相信,论坛里有很多能人,一眼就能看出我那脚本的解构方式和思路。
无非就是把数组拆分个数,然后解析判断,,,,
我也知道我那脚本还有很多不足和bug,,,,
但是,有时候我就是懒,懒得修改和完善,因为那些对我的生活,没多大帮助和改善,,,,
这也是我没什么动力去研究第三方工具的原因,不是Windows自带的和支持的,基本懒得去深究,,,
初代版本,只有简单的结构,,
二代版本,修缮了多个0的结尾bug,,
三代版本,加上了 角 分 单位的解构,也添加了把结果变成“变量”方便调用和转换(理论上还可以加上  毫 厘 (但是我懒)),,,
(脚本是我从“我的脚本工具箱”里扣出来的,有一些无用的标签和调用,我尽量删除吧!删不完也别怪我,)
我还是很喜欢Windows自带脚本编写的,除了 BAT,也就,VBS,js,reg,hta,htm,,,,之类的(说白了就是Windows自带支持的语言,不借助第三方命令开发和编写的脚本),,
OK !废话完,上代码,,,,,(以后基本不完善和修改了,哪怕是修改,也懒得发布了),,,,,,,,,,,,
  1. Set/p  就是调用=请输入人民币的阿拉伯数字(只支持小数点后两位):
  2. Call,:RMB %就是调用%
  3. :RMB
  4. Set R=%~1
  5. REM 百度得出中文单位分别是:清净(10的负二十一次方)、虚空、六德、刹那、弹指、瞬息、须臾、逡巡、模糊、漠、渺、埃、尘、沙、纤、微、忽、丝、毫、厘、分、零、壹、贰、叁、肆、伍、陆、柒、捌、玖、分、角、圆、拾、佰、仟、萬、亿、兆、京、垓、秭、穰、沟、涧、正、载、极(10的四十八次方)
  6. Echo %R%|Find "." >Nul && Goto,RMB角分
  7. :RMBB
  8. Echo %~1|FindStr "^[0-9]*$">Nul || Echo 非法输入!按任意键退出!&&Pause>Nul&&Exit
  9. Set RMB检测=
  10. Set RMB检测=%~1
  11. Set RMB窗口=
  12. Set RMB窗口=%~1
  13. Set 大写=
  14. REM  下个单位变量决定你怎么表达货币单位。以及是否加空格、、、
  15. Set "单位=圆 "
  16. :RMB位数
  17. Set RMB窗口=%RMB窗口:~1%
  18. Set/a RMB位数+=1
  19. If Not "%RMB窗口%"=="" Goto,RMB位数
  20. Echo.输入:%R%
  21. :RMB循环
  22. Set/a RMB位数-=1
  23. Call,:RMB转换 %RMB检测:~0,1% %RMB位数%
  24. Set RMB检测=%RMB检测:~1%
  25. If Not "%RMB检测%"=="" Goto,RMB循环
  26. If "%角%"=="1" Set/p="壹角"<Nul&Set 大写=%大写%壹角
  27. If "%角%"=="2" Set/p="贰角"<Nul&Set 大写=%大写%贰角
  28. If "%角%"=="3" Set/p="叁角"<Nul&Set 大写=%大写%叁角
  29. If "%角%"=="4" Set/p="肆角"<Nul&Set 大写=%大写%肆角
  30. If "%角%"=="5" Set/p="伍角"<Nul&Set 大写=%大写%伍角
  31. If "%角%"=="6" Set/p="陆角"<Nul&Set 大写=%大写%陆角
  32. If "%角%"=="7" Set/p="柒角"<Nul&Set 大写=%大写%柒角
  33. If "%角%"=="8" Set/p="捌角"<Nul&Set 大写=%大写%捌角
  34. If "%角%"=="9" Set/p="玖角"<Nul&Set 大写=%大写%玖角
  35. If "%分%"=="1" Set/p="壹分"<Nul&Set 大写=%大写%壹分
  36. If "%分%"=="2" Set/p="贰分"<Nul&Set 大写=%大写%贰分
  37. If "%分%"=="3" Set/p="叁分"<Nul&Set 大写=%大写%叁分
  38. If "%分%"=="4" Set/p="肆分"<Nul&Set 大写=%大写%肆分
  39. If "%分%"=="5" Set/p="伍分"<Nul&Set 大写=%大写%伍分
  40. If "%分%"=="6" Set/p="陆分"<Nul&Set 大写=%大写%陆分
  41. If "%分%"=="7" Set/p="柒分"<Nul&Set 大写=%大写%柒分
  42. If "%分%"=="8" Set/p="捌分"<Nul&Set 大写=%大写%捌分
  43. If "%分%"=="9" Set/p="玖分"<Nul&Set 大写=%大写%玖分
  44. Echo.&Echo.-----------------------&Set /p RMB复制=      按C复制RMB大写。
  45. If /i "%RMB复制%"=="c" Set/p="%大写%"<Nul|Clip
  46. REM    这里是脚本结尾 ,%大写% 是转换后的变量,上诉命令和写法都有很多编排和写发上的不足,希望大神们完善(反正我是懒得继续完善了)。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  47. Pause>Nul & Exit
  48. :RMB转换
  49. If "%~1"=="0" Goto,RMB零
  50. If "%~1"=="1" Set/p="壹"<Nul&Set 大写=%大写%壹
  51. If "%~1"=="2" Set/p="贰"<Nul&Set 大写=%大写%贰
  52. If "%~1"=="3" Set/p="叁"<Nul&Set 大写=%大写%叁
  53. If "%~1"=="4" Set/p="肆"<Nul&Set 大写=%大写%肆
  54. If "%~1"=="5" Set/p="伍"<Nul&Set 大写=%大写%伍
  55. If "%~1"=="6" Set/p="陆"<Nul&Set 大写=%大写%陆
  56. If "%~1"=="7" Set/p="柒"<Nul&Set 大写=%大写%柒
  57. If "%~1"=="8" Set/p="捌"<Nul&Set 大写=%大写%捌
  58. If "%~1"=="9" Set/p="玖"<Nul&Set 大写=%大写%玖
  59. If "%~2"=="51" Set/p="仟"<Nul&Set 大写=%大写%仟
  60. If "%~2"=="50" Set/p="佰"<Nul&Set 大写=%大写%佰
  61. If "%~2"=="49" Set/p="拾"<Nul&Set 大写=%大写%拾
  62. If "%~2"=="48" Set/p="极"<Nul&Set 大写=%大写%极&Set 位=1&Goto,:Eof
  63. If "%~2"=="47" Set/p="仟"<Nul&Set 大写=%大写%仟
  64. If "%~2"=="46" Set/p="佰"<Nul&Set 大写=%大写%佰
  65. If "%~2"=="45" Set/p="拾"<Nul&Set 大写=%大写%拾
  66. If "%~2"=="44" Set/p="载"<Nul&Set 大写=%大写%载&Set 位=1&Goto,:Eof
  67. If "%~2"=="43" Set/p="仟"<Nul&Set 大写=%大写%仟
  68. If "%~2"=="42" Set/p="佰"<Nul&Set 大写=%大写%佰
  69. If "%~2"=="41" Set/p="拾"<Nul&Set 大写=%大写%拾
  70. If "%~2"=="40" Set/p="正"<Nul&Set 大写=%大写%正&Set 位=1&Goto,:Eof
  71. If "%~2"=="39" Set/p="仟"<Nul&Set 大写=%大写%仟
  72. If "%~2"=="38" Set/p="佰"<Nul&Set 大写=%大写%佰
  73. If "%~2"=="37" Set/p="拾"<Nul&Set 大写=%大写%拾
  74. If "%~2"=="36" Set/p="涧"<Nul&Set 大写=%大写%涧&Set 位=1&Goto,:Eof
  75. If "%~2"=="35" Set/p="仟"<Nul&Set 大写=%大写%仟
  76. If "%~2"=="34" Set/p="佰"<Nul&Set 大写=%大写%佰
  77. If "%~2"=="33" Set/p="拾"<Nul&Set 大写=%大写%拾
  78. If "%~2"=="32" Set/p="沟"<Nul&Set 大写=%大写%沟&Set 位=1&Goto,:Eof
  79. If "%~2"=="31" Set/p="仟"<Nul&Set 大写=%大写%仟
  80. If "%~2"=="30" Set/p="佰"<Nul&Set 大写=%大写%佰
  81. If "%~2"=="29" Set/p="拾"<Nul&Set 大写=%大写%拾
  82. If "%~2"=="28" Set/p="穰"<Nul&Set 大写=%大写%穰&Set 位=1&Goto,:Eof
  83. If "%~2"=="27" Set/p="仟"<Nul&Set 大写=%大写%仟
  84. If "%~2"=="26" Set/p="佰"<Nul&Set 大写=%大写%佰
  85. If "%~2"=="25" Set/p="拾"<Nul&Set 大写=%大写%拾
  86. If "%~2"=="24" Set/p="秭"<Nul&Set 大写=%大写%秭&Set 位=1&Goto,:Eof
  87. If "%~2"=="23" Set/p="仟"<Nul&Set 大写=%大写%仟
  88. If "%~2"=="22" Set/p="佰"<Nul&Set 大写=%大写%佰
  89. If "%~2"=="21" Set/p="拾"<Nul&Set 大写=%大写%拾
  90. If "%~2"=="20" Set/p="垓"<Nul&Set 大写=%大写%垓&Set 位=1&Goto,:Eof
  91. If "%~2"=="19" Set/p="仟"<Nul&Set 大写=%大写%仟
  92. If "%~2"=="18" Set/p="佰"<Nul&Set 大写=%大写%佰
  93. If "%~2"=="17" Set/p="拾"<Nul&Set 大写=%大写%拾
  94. If "%~2"=="16" Set/p="京"<Nul&Set 大写=%大写%京&Set 位=1&Goto,:Eof
  95. If "%~2"=="15" Set/p="仟"<Nul&Set 大写=%大写%仟
  96. If "%~2"=="14" Set/p="佰"<Nul&Set 大写=%大写%佰
  97. If "%~2"=="13" Set/p="拾"<Nul&Set 大写=%大写%拾
  98. If "%~2"=="12" Set/p="兆"<Nul&Set 大写=%大写%兆&Set 位=1&Goto,:Eof
  99. If "%~2"=="11" Set/p="仟"<Nul&Set 大写=%大写%仟
  100. If "%~2"=="10" Set/p="佰"<Nul&Set 大写=%大写%佰
  101. If "%~2"=="9" Set/p="拾"<Nul&Set 大写=%大写%拾
  102. If "%~2"=="8" Set/p="亿"<Nul&Set 大写=%大写%亿&Set 位=1&Goto,:Eof
  103. If "%~2"=="7" Set/p="仟"<Nul&Set 大写=%大写%仟
  104. If "%~2"=="6" Set/p="佰"<Nul&Set 大写=%大写%佰
  105. If "%~2"=="5" Set/p="拾"<Nul&Set 大写=%大写%拾
  106. If "%~2"=="4" Set/p="萬"<Nul&Set 大写=%大写%萬&Set 位=1&Set 零=0&Goto,:Eof
  107. If "%~2"=="3" Set/p="仟"<Nul&Set 大写=%大写%仟
  108. If "%~2"=="2" Set/p="佰"<Nul&Set 大写=%大写%佰
  109. If "%~2"=="1" Set/p="拾"<Nul&Set 大写=%大写%拾
  110. If "%~2"=="0" Set/p="%单位%"<Nul&Set "大写=%大写%%单位%"
  111. Set "零=0"&Set "位=0"
  112. Goto,:Eof
  113. :RMB零
  114. Set 后零=%RMB检测:~1,1%
  115. If "%后零%"=="" Set "零=1"
  116. If "%~2"=="0" Set/p="%单位%"<Nul&Set "大写=%大写%%单位%"
  117. If "%~2"=="4" If "%位%"=="0" Set/p="萬"<Nul&Set 大写=%大写%萬&Set 位=1&Set 零=0&Goto,:Eof
  118. If "%~2"=="8" If "%位%"=="0" Set/p="亿"<Nul&Set 大写=%大写%亿&Set 位=1&Set 零=1&Goto,:Eof
  119. If "%~2"=="12" If "%位%"=="0" Set/p="兆"<Nul&Set 大写=%大写%兆&Set 位=1&Set 零=1&Goto,:Eof
  120. If "%~2"=="16" If "%位%"=="0" Set/p="京"<Nul&Set 大写=%大写%京&Set 位=1&Set 零=1&Goto,:Eof
  121. If "%~2"=="20" If "%位%"=="0" Set/p="垓"<Nul&Set 大写=%大写%垓&Set 位=1&Set 零=1&Goto,:Eof
  122. If "%~2"=="24" If "%位%"=="0" Set/p="秭"<Nul&Set 大写=%大写%秭&Set 位=1&Set 零=1&Goto,:Eof
  123. If "%~2"=="28" If "%位%"=="0" Set/p="穰"<Nul&Set 大写=%大写%穰&Set 位=1&Set 零=1&Goto,:Eof
  124. If "%~2"=="32" If "%位%"=="0" Set/p="沟"<Nul&Set 大写=%大写%沟&Set 位=1&Set 零=1&Goto,:Eof
  125. If "%~2"=="36" If "%位%"=="0" Set/p="涧"<Nul&Set 大写=%大写%涧&Set 位=1&Set 零=1&Goto,:Eof
  126. If "%~2"=="40" If "%位%"=="0" Set/p="正"<Nul&Set 大写=%大写%正&Set 位=1&Set 零=1&Goto,:Eof
  127. If "%~2"=="44" If "%位%"=="0" Set/p="载"<Nul&Set 大写=%大写%载&Set 位=1&Set 零=1&Goto,:Eof
  128. If "%~2"=="48" If "%位%"=="0" Set/p="极"<Nul&Set 大写=%大写%极&Set 位=1&Set 零=1&Goto,:Eof
  129. If "%零%"=="0" ( If Not "%后零%"=="0" Set/p="零"<Nul&Set 大写=%大写%零&Set "零=1" )
  130. Goto,:Eof
  131. :RMB角分
  132. For /f "tokens=1,2 delims=." %%a in ("%R%") do (Set "Y=%%a"&Set "F=%%b" )
  133. Echo %F%|FindStr "^[0-9]*$">Nul || Call,:Pxit E0 27 1 2 " 非法输入!按任意键退出!"
  134. If Not "%F%"=="" Set "角=%F:~0,1%"&Set "分=%F:~1,1%"
  135. If Not "%Y%"=="" Call,:RMBB %Y%
  136. Goto,:Eof
复制代码
输入:450000000000000000001.25
得出:肆垓伍仟京壹圆 贰角伍分

强,佩服
谢谢分享

TOP

看来是老了,特别容易陷入回忆
上次热衷数字大小写转换的话题还是2007年
算法数据结构什么的
已经没什么印象了
当时只觉得挺好玩的
相信你也是一样的
这是我之前参与讨论的话题
https://www.cn-dos.net/forum/viewthread.php?tid=26230#pid162959
这是后来这里讨论的话题没有参与
http://bbs.bathome.net/viewthread.php?tid=705
可以互相借鉴一下吧
天的白色影子

TOP

网搜了一下官方的人民币金额大写书写规范
没有找到太权威的来源,只找到下面这个
http://chongqing.pbc.gov.cn/chon ... /2773593/index.html

根据以上规范测试了以上脚本转换的可靠性
排除了“人民币”前缀、“整”后缀这种通用问题
以及元和圆,万和萬的简繁适配问题
还发现了以下问题
  1. 0 转换异常 大写:圆 参考:人民币零圆
  2. 1000000000000 转换异常 大写:壹兆圆 参考:人民币壹萬亿圆
  3. 101000 转换异常 大写:壹拾萬壹仟圆 参考:人民币壹拾萬零壹仟圆
  4. 100000001 转换异常 大写:壹亿壹圆 参考:人民币壹亿零壹圆
  5. 1000000001 转换异常 大写:壹拾亿壹圆 参考:人民币壹拾亿零壹圆
  6. 1000000010 转换异常 大写:壹拾亿壹拾圆 参考:人民币壹拾亿零壹拾圆
  7. 1000001000 转换异常 大写:壹拾亿壹仟圆 参考:人民币壹拾亿零壹仟圆
  8. 1000010000 转换异常 大写:壹拾亿壹萬圆 参考:人民币壹拾亿零壹萬圆
  9. 1000100000 转换异常 大写:壹拾亿壹拾萬圆 参考:人民币壹拾亿零壹拾萬圆
  10. 1010000000 转换异常 大写:壹拾亿壹仟萬圆 参考:人民币壹拾亿零壹仟萬圆
  11. 0.0 转换异常 大写:圆 参考:人民币零圆
  12. 0.1 转换异常 大写:圆壹角 参考:人民币壹角
  13. 0.01 转换异常 大写:圆壹分 参考:人民币壹分
  14. 0.10 转换异常 大写:圆壹角 参考:人民币壹角
  15. 10.1 转换异常 大写:壹拾圆壹角 参考:人民币壹拾圆零壹角
  16. 10.01 转换异常 大写:壹拾圆壹分 参考:人民币壹拾圆零壹分
  17. 11.01 转换异常 大写:壹拾壹圆壹分 参考:人民币壹拾壹圆零壹分
  18. 100.1 转换异常 大写:壹佰圆壹角 参考:人民币壹佰圆零壹角
  19. 100.01 转换异常 大写:壹佰圆壹分 参考:人民币壹佰圆零壹分
  20. 1000.1 转换异常 大写:壹仟圆壹角 参考:人民币壹仟圆零壹角
  21. 1000.01 转换异常 大写:壹仟圆壹分 参考:人民币壹仟圆零壹分
  22. 10000.1 转换异常 大写:壹萬圆壹角 参考:人民币壹萬圆零壹角
  23. 10000.01 转换异常 大写:壹萬圆壹分 参考:人民币壹萬圆零壹分
  24. 100000.1 转换异常 大写:壹拾萬圆壹角 参考:人民币壹拾萬圆零壹角
  25. 100000.01 转换异常 大写:壹拾萬圆壹分 参考:人民币壹拾萬圆零壹分
  26. .1 转换异常 大写:壹圆壹分 参考:人民币壹角
  27. .01 转换异常 大写:零壹圆壹分 参考:人民币壹分
复制代码
天的白色影子

TOP

TOP

为啥输入:450000000000000000001.25
得出:肆垓伍仟京壹圆 贰角伍分
而不是:肆垓伍仟京壹圆 贰角伍分

TOP

本帖最后由 qzwqzw 于 2025-3-21 23:11 编辑

重复零的处理逻辑比较复杂,官方规范有几个要求:
(1)阿拉伯数字中间有“0”时,中文大写金额要写“零”。
(2)阿拉伯数字中间连续有几个“0”时,中文大写金额中间可以(应该)只写一个“零”字。
(3)阿拉伯金额数字万位或元位是“0”,或者数字中间连续有几个“0”,万位、元位也是“0”,但千位、角位不是“0”时,中文大写金额中可以只写一个“零”字,也可以不写“零”字。
(4)阿拉伯金额数字角位是“0”,而分位不是“0”时,中文大写金额“元”后面应写“零”字。
除此而外,实际转换过程中,也要考虑亿位的零处理,有几个隐含的规则:
(5)亿位到元位之间如果全为零,可以(应该)用一个"零"字,省略“万”字;
(6)亿位如果是零,即使千万位不为零,“亿”字后可以跟“零”字,也可以不跟,同规则(4)
天的白色影子

TOP

返回列表