数字转为人民币大写汉字输出(大力看了都喊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

相关文章
|
6月前
|
存储 算法 测试技术
第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
第十五届蓝桥杯大赛 国赛 pb组F题【括号与字母】(15分) 栈的应用
42 1
|
7月前
每日一题——只出现一次的数字(II)
每日一题——只出现一次的数字(II)
每日一题——只出现一次的数字(II)
|
7月前
每日一题——只出现一次的数字
每日一题——只出现一次的数字
|
7月前
每日一题——只出现一次的数字(III)
每日一题——只出现一次的数字(III)
|
编解码 JavaScript 前端开发
合工大-数字媒体与技术期末考试及题解
合工大-数字媒体与技术期末考试及题解
140 0
L1-007 念数字 (10 分)
L1-007 念数字 (10 分)
325 0
7-25 念数字 (15 分)
7-25 念数字 (15 分)
169 0
L1-007 念数字
输入一个整数,输出每个数字对应的拼音。当整数为负数时,先输出fu字。十个数字对应的拼音如下: 0: ling 1: yi 2: er 3: san 4: si 5:
149 0