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

简介: 将用户输入的数字转为人民币大写汉字输出。(壹贰叁肆伍陆柒捌玖拾亿万佰千零圆),我们的目的是将一个数字转换成为我们所读出来的汉语写法,类似于银行中用到的转换,比较适合python的初学者来练习。

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

我们的目的是将一个数字转换成为我们所读出来的汉语写法,类似于银行中用到的转换,比较适合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)



下面为输出效果图:

image.png

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


就是如此简单,写完了…


真的结束了吗?并没有

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

image.png

我们预想到结果应该是:壹万零捌拾陆元

结果不一样说明我们编写的程序还存在很大的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)



最后输出结果如下:

image.png

相关文章
|
5月前
|
存储 算法 测试技术
第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
37 1
|
6月前
|
人工智能 算法 安全
什么是数字分身
什么是数字分身
661 3
|
Windows
腾讯智影+IDM进行数字人制作(无限使用)
腾讯智影+IDM进行数字人制作(无限使用)
中文计数法亿兆京垓秭穰沟涧正载
中文计数法亿兆京垓秭穰沟涧正载
414 0
中文计数法亿兆京垓秭穰沟涧正载
PTA 7-2 数字之王 (20 分)
给定两个正整数 N 1 ​ <N 2 ​ 。把从 N 1 ​ 到 N 2 ​ 的每个数的各位数的立方相乘,再将结果的各位数求和,得到一批新的数字,再对这批新的数字重复上述操作,直到所有数字都是 1 位数为止
121 0
|
供应链 安全 开发者
2022联合利华黑客马拉松  数字U家,即刻触发
赛事背景 加速数字化转型、提升数字化能力建设一直是联合利华的重要行动之一,不论是电商、市场、供应链、研发还是终端的销售,数字化几乎已经渗透到了联合利华的各个部门。 作为快消行业领先的数字化先锋,本季赛题开放了联合利华研究发展部、数字化营销及分析中心、供应链、IT四大业务部门的真实商业场景,寻找数字化创新领域的Hackers、携手U家,以数据技术对实体商业赋能、使商业更加高效且智能化,拓展消费触达领域,同时用数字化的力量提升消费者的体验感。
2022联合利华黑客马拉松  数字U家,即刻触发
|
存储 人工智能 安全
万字长文解读,数字体育进入黄金窗口期
2021年是十四五的开局之年,也是全面推动数字中国建设之年,而数字体育作为消费经济和数字经济结合的新领域,正在迎来创新创业的黄金窗口期。特别是截至2020年,我国已经连续两年人均GDP超过1万美元,部分城市的人均GDP更超过2万美元而进入了发达国家标准,从国际经验看体育产业将持续较快增长,甚至成为国民经济支柱性产业。当快速发展的体育产业遇到全球疫情,这就打开了数字体育的黄金窗口期。
263 0
万字长文解读,数字体育进入黄金窗口期
|
双11 测试技术 OceanBase
万字长文丨1分36秒,100亿,支付宝技术双11答卷:没有不可能
2019年双11:1分36秒100亿,5分25秒超过300亿,12分49秒超500亿……如果没有双11,中国的互联网技术要发展到今天的水平,或许要再多花20年。
2321 0