人民币转换实现
题目
题目:银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序。
题目来源
思路
核心思想:递归
具体过程如下:
- 首先题目已经告诉需要转换的数字为整数,所以只需要考虑正负号即可;
- 构建
数字:对应的中文货币
字典(人民币中文符号:零壹贰叁肆伍陆柒捌玖拾佰仟万
) - 已整整数为例,构造函数
rmbConverting
:- 小于10;-->直接输出
- 考虑是整
拾佰仟万
的情况;-->实现通过将其转化为字符串,然后观察0的个数
- 考虑小于100(两位数);--比较简单
- 考虑小于1000(三位数);-->
将其转化为整佰+两位数
,目的方便递归; - 考虑小于10000(四位数);-->
将其转化为整仟+三位数
- 对于超过10000的,可以考虑分成两半:
a//10000
和a-a//10000*10000
,然后递归即可;
- 最后输出时,区分正负号。为了方便构建函数
printrmb
。
完整程序
rmb_unit=list(u'零壹贰叁肆伍陆柒捌玖拾佰仟万')
rmb_num=[0,1,2,3,4,5,6,7,8,9,10,100,1000,10000]
rmb_dict={i:j for i,j in zip(rmb_num,rmb_unit)}
def rmbConverting(a,Dict=rmb_dict):
"""
这个函数只处理正数的情况
@params:a为输入的整数
@params: Dict为数字对应的中文,type:dict
"""
unit=[i[0] for i in list(Dict.items())[1:]]
str_a_len=len(str(a))
all_0_num=list(str(a)).count('0')
if a <=10:
return Dict[a]+'圆'
elif str_a_len-all_0_num==1:
tmp=10**all_0_num
return Dict[a/tmp]+Dict[tmp]+'圆'
elif a<100:
return Dict[a//10]+Dict[10]+Dict[a-a//10*10]+'圆'
elif a<1000:
b=a//100
c=a-b*100
res=Dict[b]+Dict[100]+rmbConverting(c) if c>=10 else Dict[b]+Dict[100]+'零'+rmbConverting(c)
return res
elif a<10000:
b=a//1000
c=a-b*1000
return Dict[b]+Dict[1000]+rmbConverting(c) if c>=100 else Dict[b]+Dict[1000]+'零'+rmbConverting(c)
else:
b=a-a//10000*10000
return rmbConverting(a//10000)[:-1]+Dict[10000]+rmbConverting(b) if b>=1000 else rmbConverting(a//10000)[:-1]+Dict[10000]+'零'+rmbConverting(b)
def printrmb(a):
print( '负'+rmbConverting(abs(a)) if a<0 else rmbConverting(a))
if __name__=='__main__':
a=1234
printrmb(a)