将用户输入的数字转为人民币大写汉字输出。(壹贰叁肆伍陆柒捌玖拾亿万佰千零圆)


我们的目的是将一个数字转换成为我们所读出来的汉语写法,类似于银行中用到的转换,比较适合python的初学者来练习

首先我们应该知道读出来时候包括数字所对应的汉字还有单位所对应的汉字
像数字这样的汉字转换我们可以保存在字典当中进行索引转换,但是单位就比较麻烦了,我们先来看一个简单的例子:
数字:123456789元
读作:壹亿贰千叁百肆拾伍万陆千柒百捌拾玖元
由此我们可以观察推理出来单位的规律由低位依次是:元拾佰仟万拾佰仟亿拾佰仟万拾佰仟(此处请细品)

所有编程题目都一样,在分析清楚之后我们才可以开始动手写

#字典存放数字转换,元组存放单位转换
ch_number={1:"壹",2:"贰",3:"叁",4:"肆",5:"伍",6:"陆",7:"柒",8:"捌",9:"玖",0:"零"}
ch_unit=("元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟")
#建议大家写python时候对输入的初始值不要直接处理,尽量保留初始值
n=input("请输入需要转换的钱数:")
#判断输入是否正确,如果错误给出提示信息并且等待输入
while int(n)<0:n=input("输入错误请重新输入需要转换的钱数:")
l=len(n)-1
ch=[]  #定义一个列表来储存转换后的数字
i=0
#数字转换为对应汉字
for i in n:j=int(i)ch.append(ch_number[j])   #append() 方法向列表末尾追加元素。ch.append(ch_unit[l])l-=1
#最后还需要初始化一个字符串类型来存放我们要输出的形式
sh=""
i=0
for i in range(i,len(ch)):sh=sh+ch[i]
print(sh)

下面为输出效果图:

输出也正是我们预想到的结果,一切正常!

就是如此简单,写完了…

真的结束了吗?并没有
当我们输入一个特殊的数字时我们会发现,得到的结果并不是我们想要的,譬如:

我们预想到结果应该是:壹万零捌拾陆元
结果不一样说明我们编写的程序还存在很大的bug,没错还得继续淦!

我们对比预想输出的和实际输出的会发现,实际输出的结果,多了一些不该存在的零和单位,所以我们只需要想办法把这些不该存在的东西去掉就好了

我们最后输出时是将列表转换为字符串输出的,所以我们可以把不该输出的东西找到进行标记,在列表转换为字符串时不进行转换即可

根据这个思路接下来我们需要判断出哪些不该输出

接下来的步骤也是比较有难度的了,我自己写的时候也是十分混乱,所以我们来借鉴一位大佬的东西看看高手是怎么写的

#把所有0用x替换
#元,万,亿以外的单位用x替换
for i in range(k,0,-2):if ch[i-1]=="零":ch[i-1]="x"if ch[i]!="元" and ch[i]!="万" and ch[i]!="亿" and ch[i-1]=="x":ch[i]="x"
#把不需要恢复的0替换成y 元,万,亿前面有连续的0则不需要恢复
for i in range(k,0,-1):if (ch[i]=="元" or ch[i]=="万" or ch[i]=="亿") and ch[i-1]=="x" or ch[i]=="y" and ch[i-1]=="x":ch[i-1]="y"
#恢复0
k=len(ch)-2
for i in range(k,0,-1):if ch[i]=="x" and ch[i+1]!="零" and ch[i+1]!="x":ch[i]="零"
#通过调试删除多余的万
k=len(ch)
if k>=18 and ch[k-16]=="y" and ch[k-14]=="y" and ch[k-12]=="y":ch[k-9]="x"

原来是比较混乱的,我加了一些注释之后应该就可以看的清了

为什么替换单位时要除了元,万,亿其他都换呢?

因为元,万,亿是基础单位,不可省略的(大篇幅“0”除外–如1000000001),其他单位是根据当前数位上数字是不是零而决定的它是否存在的

看完大佬写的代码之后,很难吗?

并不难,但是我(你)为什么写不出来呢?

还是因为平时写的太少了,写的时候没有慢慢去分析,所以继续努力吧少年!!

如果你看完还有什么问题可以私我,我们可以一起来探讨一下!

新手勿喷,谢谢

最后完整的代码在下面

#字典存放数字转换,元组存放单位转换
ch_number={1:"壹",2:"贰",3:"叁",4:"肆",5:"伍",6:"陆",7:"柒",8:"捌",9:"玖",0:"零"}
ch_unit=("元","拾","佰","仟","万","拾","佰","仟","亿","拾","佰","仟","万","拾","佰","仟")
#建议大家写python时候对输入的初始值不要直接处理,尽量保留初始值
n=input("请输入需要转换的钱数:")
#判断输入是否正确,如果错误给出提示信息并且等待输入
while int(n)<0:n=input("输入错误请重新输入需要转换的钱数:")
l=len(n)-1
ch=[]  #定义一个列表来储存转换后的数字
i=0
#数字转换为对应汉字
for i in n:j=int(i)ch.append(ch_number[j])   #append() 方法向列表末尾追加元素。ch.append(ch_unit[l])l-=1
#把所有0用x替换
#元,万,亿以外的单位用x替换
k=len(ch)-1
for i in range(k,0,-2):if ch[i-1]=="零":ch[i-1]="x"if ch[i]!="元" and ch[i]!="万" and ch[i]!="亿" and ch[i-1]=="x":ch[i]="x"
#把不需要恢复的0替换成y 元,万,亿前面有连续的0则不需要恢复
for i in range(k,0,-1):if (ch[i]=="元" or ch[i]=="万" or ch[i]=="亿") and ch[i-1]=="x" or ch[i]=="y" and ch[i-1]=="x":ch[i-1]="y"
#恢复0
k=len(ch)-2
for i in range(k,0,-1):if ch[i]=="x" and ch[i+1]!="零" and ch[i+1]!="x":ch[i]="零"
#通过调试删除多余的万
k=len(ch)
if k>=18 and ch[k-16]=="y" and ch[k-14]=="y" and ch[k-12]=="y":ch[k-9]="x"
#最后还需要初始化一个字符串类型来存放我们要输出的形式
sh=""
i=0
for i in range(i,len(ch)):if ch[i]!="x" and ch[i]!="y":sh=sh+ch[i]
print(sh)

最后输出结果如下:

数字转为人民币大写汉字输出(大力看了都喊nb的详细教程)相关推荐

  1. c#的输入数字自动转为人民币大写的方法

    c#的输入数字自动转为人民币大写的方法 public static string ConvertRMB(double amount) {string[] units = { "", ...

  2. C#通用类库--数字转为人民币汉字大写表示

    //类名:EcanRMB //作用:数字转换为人民币大写 //作者:刘典武 //时间:2010-12-04 using System; using System.Collections.Generic ...

  3. .net 将数字转换为人民币大写

    程序中用到将数字转换为大写人民币,在网上找了一个方法,记录下来. using System.Text; using System.Text.RegularExpressions; ///<sum ...

  4. js 数字转人民币大写

    目前网上有许多的数字转人民币大写功能,但是在某些数字上就回出现错误, 比如501356,这个转换之后,有的会转换成 "伍拾万零壹仟叁佰伍拾陆" ,单位万和千紧密相连,中间是不需要 ...

  5. js收据、发票等表格数据格式化,js把数字转为中文大写

    1.表格金额格式化 /*** 把金额转为发票.收据等表格能遍历显示的数据* * @param {money} Numner 金额大小* @param {max} Numner 带(角.分的位数)* 例 ...

  6. C#数字转人民币大写

    C#方法 废话不多说,直接上代码: /// <summary> /// 数字转换为大写人民币表示 /// </summary> /// <param name=" ...

  7. ORACLE数字转换人民币大写

    ORACLE 数字转换人民币大写 示例. 数字                    :183066999230.68 人民币大写        :壹仟捌佰参拾亿陆仟陆佰玖拾玖万玖仟贰佰参拾圆陆角捌分 ...

  8. php人民币函数,PHP数字转人民币大写函数

    PHP数字转人民币大写函数2018-04-23 09:59 如果你是一位财务人员,肯定遇到过一个问题,就是遇到一串数字,要将其写成大写的人民币,有时很容易搞错. 那么有没有什么方法可以准确的解决呢? ...

  9. C#通用类库--数字转为人民币汉字大写表示可负大写

    using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace Shan ...

  10. 把数字转换为人民币大写(用于银行系统)

    大二是老师让做一个综合试验::用C++实现简易银行系统,其中用到在打印流水账时要求把金额转换为人民币大写...当时傻里吧唧的,,,随便拷贝了个同学的应付老师交了了事...前一段一个大二的弟兄向我提起银 ...

最新文章

  1. 如何像用MNIST一样来用ImageNet?这里有一份加速TensorFlow分布式训练的梯度压缩指南
  2. nginx代理多个flask
  3. eclipse插件 --js
  4. Python中安装bs4后,pycharm依然报错ModuleNotFoundError: No module named 'bs4'
  5. C++primer第九章 顺序容器 9.4 vector对象是如何增长的
  6. windows安装mysql-8.0.12-winx64和Navicat客户端连接(亲测有效)
  7. python判断不等_Python黑魔法笔记第六关:消灭该死的重复(下)
  8. ant design vue table 高度自适应_Table行内的开关组件的使用
  9. 数据包络分析方法与maxdea软件_数据包络模型 DEA三阶段超效率SBM非期望
  10. ubuntu 10.04解决Skype中麦克风不工作问题
  11. 定向士官计算机网络技术在部队干什么,定向培养士官是干什么的
  12. 翟菜花:搜索引擎这碗饭,到底能不能吃?
  13. 金蝶物料辅助属性改造
  14. Matlab绘制特殊图形------散点图
  15. mysql删除用户并回收权限
  16. 访问coding api
  17. 手机上如何将图片转换成PDF文档
  18. NIO 和 IO 到底有什么区别?别说你不会!
  19. 上手基金,看这一篇就够了
  20. RYU+Mininet的SDN架构-设计校园网络(四)

热门文章

  1. Unity XR Interaction Toolkit 组件解析(一)Action-based 和 Device-based 的区别
  2. 很多人在睡觉的时候半梦半醒时,感…
  3. C语言:封装图形面积公式
  4. Spoon Kettle 输入之 excel 输入详解(Microsoft Excel input)
  5. 三流大学和一流大学学生的简历有什么区别?
  6. ubuntu 19查看和修改时区
  7. 树莓派4b控制机械手臂_STM32与树莓派(上位机)交互控制机械臂
  8. 20155313 杨瀚 《网络对抗技术》实验六 信息搜集与漏洞扫描
  9. 鹿客、小米、智汀、德施曼这几款热门智能门锁测评:谁最安全?谁最便捷?
  10. div中加入span右对齐后出现换行显示的两种解决办法(转)