码迷,mamicode.com
首页 > 编程语言 > 详细

Python学习之--数字转人民币读法(解决问题的方法很重要)

时间:2019-10-05 00:59:33      阅读:103      评论:0      收藏:0      [点我收藏+]

标签:默认   不用   存储   计数   初始   友情   变换   固定   用两个   

效果图:

技术图片

实现代码:

money = float(input("Please input the money:"))
cop = int(money)
Num = [‘零‘,‘壹‘,‘贰‘,‘叁‘,‘肆‘,‘伍‘,‘陆‘,‘柒‘,‘捌‘,‘镹‘]
#用于存转换后的汉字
UnitZ = [‘‘,‘仟‘,‘佰‘,‘十‘]
#存转换需要的单位(4数字一循环)
Integer = []
#存整数部分每一位数字
Decimal = []
#存小数部分每一位数字(一共两位,精确到分)
Zheng = cop
Xiao = 0.00
#初始化小数,如果不手工指定精确2位则默认精确一位
End = []
if(‘.‘ in str(money)):#判断输入有没有小数,没有则使用初始化,有则重新计算Xiao变量(仔细读代码可以看出这个if是有问题的,本来是想没有则用初始化Xiao的值,但现在才发现并木有,那就限制下必须输入小数部分吧,在用户输入加个友情提示:必须精确到小数点后两位~)
Xiao = money - cop
for i in range(2,4):#小数部分的存储格式为0.XX,前面有一个“0”和一个“.”所以要空过去前两个字符
a = str(Xiao)
Decimal.append(a[i])
for i in str(Zheng):
Integer.append(i)
# print(Integer)
# print(Decimal)
a = 0
b = 0
Ling = 1
for i in Integer:
i = int(i)
c = len(Integer)
a += 1
b = ((a + 4)-(c % 4)) % 4#前面的a+4是考虑到位置刚开始可能小于全部长度余4的值,比如索引a+1(当前读取数字的第几位)-(c数字总长度%4)得到当前位为四位循环体(千百十空)的第几位(用于判断转换后数字后面跟的单位)
if (i != 0 and Ling == 0):
End.append(‘零‘)
Ling = 1
if(i != 0 and Ling != 0):
End.append(Num[i])
End.append(UnitZ[b])
if(i == 0):
Ling = 0
#我判断连续零的方法:当前为零则计数器为0,这个是固定的。如果当前不为零并且计数器为零,说明该位上一位为零而这位不是零则在该位前面补个零(一定要在该位数字变换前插零),巧妙之处在于‘零’这个变换不是由数字位0来决定是否插入(这样不管几个0都不会随意插‘零’),而交由0后面的非0来插入(0与非0之间肯定一个‘零’,不管非0前有几个0)
#多说一句,三条if应该可以合并成一个if/elif语句,我没试,想这个法子就好头疼啊,一下也不想看了,不改了,你想改就改吧
if (c - a == 8): End.append(‘亿‘)#每四位插一个大单位,不足四位也不用担心会乱插
if (c - a == 4): End.append(‘万‘)

End.append(‘元‘)
m = int(Decimal[0])
End.append(Num[m])
End.append(‘角‘)
n = int(Decimal[1])
End.append(Num[n])
End.append(‘分‘)
end = ‘‘.join(End)
print(end)
#最后的元和角、分由于位数固定,懒得再给搞循环了,随便手动插一下就算完了,不足之处在于,其实程序可以简单不少,完全可以把整数和小数放在一起,补个标志位啥的或者计数器记下位数之类的,然后一套循环直接做出来,我觉得挺好,留给你当作业了,我不改了,交给你了


解析:
思路很简单,把输入的数字分成两部分,整数和浮点数(单整数则小数部分初始化为0)。然后用两个列表把整数和小数部分分别存起来,然后创建个列表把数字对应的大写汉字存起来,用于一对一转换。数字转成汉字完成了,另一个就是单位问题,很巧,中文将四位数字为一组,分为万、亿、兆,我设置的上限是亿(兆在现实中也用不到吧。。。),然后四位中都是千、百、十。确定好循环及千百十对应的位置关系,当转换完一个数字就把千百十加进一个,每逢四位加一个大单位“万、亿”。另一个需要注意的是零,比较特殊,单个零不跟单位“千百十”,多个零连续则合成一个零,这里我通余4和总长度跟现长度的差进行调试了半天才解决。
我觉得比较重要的一个思路就是我一开始就决定了用列表的形式存储最后的结果,然后内容是按字符逐个添加。由于有连续零等多个不确定列表长度的因素存在,所以在构建列表时是采用的append方法往最后面加,比较方便,最后把列表一转字符串就得到结果了。
方向很重要!如果用开始就用字符串来存可能就不会那么简单了,程序可以更简单的,包括里面的一些我临时用来计数的变量等,我觉得是可以再简化简化的,但在测试无误后我又不想再费时间改了,有点晚啊,改好麻烦啊╮(╯▽╰)╭,就这样吧,谁看了想改自己再改进吧。
好久没写博客了,也是因为最近做的练习少了,一方面因为最近在看Python基础教程书,没做到什么练习(看基础书好无聊啊),另一方面是现在在花时间学英语,还准备考个英语六级啊,最近一直在看英文小说,看完几个短篇的了,最近在看《傲慢与偏见》,加油啊!

Python学习之--数字转人民币读法(解决问题的方法很重要)

标签:默认   不用   存储   计数   初始   友情   变换   固定   用两个   

原文地址:https://www.cnblogs.com/zhurs/p/11623641.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!