今天我们来实现一个人民币大写转换的程序,一方面工作上常有审批、报销的需求;另一方面是当作一个教学案例。
如果单纯就应用谈应用,我们直接上网随意打开一个转换网站就是了。或者用Python做个窗口程序,背后偷偷调用网页的结果效果也挺好。但是,拿来主义固然讨巧,却对网络有依赖性。而且,如果大家都等着拿现成的应用来调用,不就陷入了类似OS死锁的状态吗?
其实这个程序对思维训练和编码实践,都是非常好的案例。在我们中学阶段,用计算思维越来越被重视今天,非常适合做为列表、字典、循环、函数这一部分的综合训练。学完了函数,做这个小项目,绝对是温故知新的绝佳案例。
好了,需求不说了,找个样板:
思路:
我们假定小数是两位。
一、数据结构设计:
列表:个位权重开头,往后写到足够用,分别对应数位名称
['圆','拾','百','千','万','拾','百','千','亿','拾','百','千','万','拾','百','千','兆']
字典:拿到了数字就得到了汉字,方便索引{'0':'零','1':'壹','2':'贰','3':'叁','4':'肆','5':'伍','6':'陆','7':'柒','8':'捌','9':'玖'}
二、小数部分处理:
拿出数字来字典转换后与角和分拼接字符串即可。
三、整数部分处理:
翻转成个位开头对应元,十位对应拾,百位对佰,依次类推。然后逆序组合输出。
四、多零与跨万处理:
这一部分耗时最多,一开始总想着加一个标志位,看看是不是第一个“零”,要不是第一个就不加了。后来发现为像1002345这种还少个万字,万字可以通过判断下标是不是4的余数来解决,包括亿字也能解决。那么就还是“零”的问题了,折腾半天,决定这样做:
遇到0,看是否万、亿位,是的话调万或者亿字,否的话加零,但保证循环过程中最后只有一个零。最后通过一个replace函数把出问题的字符进行替换。目前经过测试,正常使用了。
给大家画个草图:
代码:
结果:
代码:
# -*- coding: utf-8 -*-
def Num2Money(num):
result=''
format_word = ["元","拾","百","千","万","拾","百","千","亿","拾","百","千","万","拾","百","千","兆"]
dic= {"0":"零","1":"壹","2":"贰","3":"叁","4":"肆","5":"伍","6":"陆","7":"柒","8":"捌","9":"玖"}
rNum=reverseNum(num)
for i in range(len(rNum)-1,-1,-1):
seq=rNum[i]
if seq!='0':
result=result+dic[seq]+format_word[i]
else:
if i%4==0:#万、亿等位
result=result+format_word[i]
else:
if result[-1]!='零':
result=result+'零'
if '.' in num:
result=result+dic[num[-2]]+'角'+dic[num[-1]]+'分'
else:
result=result+'整'
result=result.replace('零万','万').replace('亿万','亿零').replace('零零','零').replace('零元','元')
return result
def reverseNum(n):
if '.' in n:
s=n.split('.')[0]
else:
s=n
l = list(s) #模拟全部入栈
result = ""
while len(l)>0:
result += l.pop() #模拟出栈
return result
while 1:
ipt=input('请输入金额:\n')
print(Num2Money(ipt)
代码下载:
回复
getMoney
总结:
1、数据结构很重要,决定了能否方便读取、存入、联合。
2、思路不能僵化,不能事前通盘考虑,亦可事后修补。
3、先完成主体功能,再逐步细化,重点在基本算法。
如果依然后bug,欢迎留言告知。
领取专属 10元无门槛券
私享最新 技术干货