必威体育Betway必威体育官网
当前位置:首页 > IT技术

python 作业2:人民币大写转换问题

时间:2019-10-04 21:10:00来源:IT技术作者:seo实验室小编阅读:62次「手机版」
 

2的大写

题目描述:

银行在打印票据的时候,常常需要将阿拉伯数字表示的人民币金额转换为大写表示,现在请你来完成这样一个程序

在中文大写方式中,0到10以及100、1000、10000被依次表示为: 零 壹 贰 叁 肆 伍 陆 柒 捌 玖 拾 佰 仟 万

以下的例子示范了阿拉伯数字到人民币大写的转换规则:

1 壹圆

11 壹拾壹圆

111 壹佰壹拾壹圆

101 壹佰零壹圆

-1000 负壹仟圆

1234567 壹佰贰拾叁万肆仟伍佰陆拾柒圆

现在给你一个整数a(|a|<100000000), 请你打印出人民币大写表示.

例如:a=1

则输出:壹圆

注意:请以unicode的形式输出答案。提示:所有的中文字符,在代码中直接使用其Unicode的形式即可满足要求,中文的Unicode编码可以通过如下方式获得:u'壹'。

这题目最头疼的地方是当一串数字中间和末尾都存在0的时候,要去掉重复出现的0和对应的单位。

例如:             6100 0310元

对应的大写为:   陆仟壹佰万零叁佰壹拾圆

这里6100后面的零转换成大写之后都去掉了,0310个位数上的0也去掉了,但是千位上的数字0保留。

针对题目中的最高八位数的转换,我的思路是先考虑简单的,当输入的数字是1,2,3,或者4位数时,就简单罗列出情况即可,其中4位数时情况较为复杂。以4位数为例,主要考虑0的个数0的位置,一共有如下的16种情况:(以字母N表示该位置是除0以外的其他数字)

NNNN

NNN0

NN0N

NN00

N0NN

N0N0

N00N

N000

0NNN

0NN0

0N0N

0N00

00NN

00N0

000N

0000

这里我把这16种情况分别写进了程序里,待会儿我去看看大神是怎么写的,完整程序如下:

# -*- coding: utf-8 -*-
import itertools  
a=-4603100;
c={'0':'零','1':'壹','2':'贰','3':'叁','4':'肆','5':'伍','6':'陆','7':'柒','8':'捌','9':'玖'}
L=[];
k=0;
def AUTO_4(L2,L3):
	if L2[0]==0:
		if L2[1]==0:
			if L2[2]==0:
				if L2[3]==0:
					del L3[0:7];
				else:
					del L3[1:6];
			else:
				if L2[3]==0:
					del (L3[1:4],L3[3]);
				else:
					del L3[1:4];
		else:   #L[1]!=0  讨论四种情况
			if L2[2]==0:
				if L2[3]==0:
					del (L3[0:2],L3[2:5]);
				else:
					del (L3[0:2],L3[2:4]);
			else:
				if L2[3]==0:
					del (L3[0:2],L3[4]);
				else:
					del L3[0:2];	
	else:
		if L2[1]==0:
			if L2[2]==0:
				if L2[3]==0:
					del L3[2:7];
				else:
					del L3[3:6];
			else:
				if L2[3]==0:
					del (L3[3],L3[5]);
				else:
					del L3[3];
		else:   #L[1]!=0  讨论四种情况
			if L2[2]==0:
				if L2[3]==0:
					del L3[4:7];
				else:
					del L3[4:6];
			else:
				if L2[3]==0:
					del L3[6];
	return L3
#判断正负
if a<0:
	a=-a;
	k=1;#标志位
	
#将一个数转成数字列表
while True:
	(n,l)=pmod(a,10);
	L.APPend(l);
	a=n;
	if a==0:
		break
L2=L[::-1];    #因为除法的原因,需要倒一下顺序才是原来的是顺序
NL=len(L2);    #判断数的长度
L3=[];

for i in L2:
	L3.append(c[str(i)])   #查询字典之后形成一个列表

#在前四位数加上单位
def PP1(NL,L2,L3):
	if NL==1:
		L3.insert(1,'圆')
	if NL==2:
		L3.insert(1,'拾')
		if L3[2]=='零':
			del L3[2]
		L3.insert(3,'圆')
	if NL==3:
		L3.insert(1,'佰')
		if L3[2]!='零':
			L3.insert(3,'拾')
			if L3[4]=='零':
				del L3[4]
		else:
			if L3[3]=='零':
				del L3[2]
				del L3[2]
		L3.insert(5,'圆')

	if NL==4:
		L3.insert(1,'仟')
		L3.insert(3,'佰')
		L3.insert(5,'拾')
		L3.insert(7,'圆')
		AUTO_4(L2,L3);
	return L3

#后四位数上加上单位
def PP2(NL,L2,L3):
	if NL==1:
		L3.insert(1,'万')
	if NL==2:
		L3.insert(1,'拾')
		if L3[2]=='零':
			del L3[2]
		L3.insert(3,'万')
	if NL==3:
		L3.insert(1,'佰')
		if L3[2]!='零':
			L3.insert(3,'拾')
			if L3[4]=='零':
				del L3[4]
		else:
			if L3[3]=='零':
				del L3[2]
				del L3[2]
		L3.insert(5,'万')

	if NL==4:
		L3.insert(1,'仟')
		L3.insert(3,'佰')
		L3.insert(5,'拾')
		L3.insert(7,'万')
		AUTO_4(L2,L3);
	return L3

if NL<5:
	Q1=PP1(NL,L2,L3);
else:
	M2=L2[-4::];
	LL2=L3[-4::];	#取出后四位数
	del(L3[-4::])
	del(L2[-4::])
	LL1=L3;        #取出前面的几位数
	M1=L2;
	NL1=len(LL1);
	Q2=PP1(4,M2,LL2);
	Q1=PP2(NL1,M1,LL1);
	Q1.extend(Q2);

#根据正负加上符号
if k==1:
	Q1.insert(0,'负')

#把列表字符合并
s = "".join(itertools.chain(*Q1)) 
print(s)

对比一下大神们的操作,自己的代码简直弱爆了,请睁大双眼

num_dic = {'0':u'零', '1':u'壹', '2':u'贰', '3':u'叁', '4':u'肆', '5':u'伍', '6':u'陆', '7':u'柒', '8':u'捌', '9':u'玖'}
unit_dic = {0:u'仟', 1:'佰', 2:'拾', 3:'万', 4:'仟', 5:'佰', 6:'拾', 7:''}
temp = []
t = str('%8d'%abs(a))    #重点:把数字换成固定长度8位的字符串
for s in range(0,4):
    if t[s] != ' ' and t[s] != '0':
        temp.append(num_dic[t[s]])
        temp.append(unit_dic[s])
    if t[s] == '0' and s <3 and t[s+1] != '0':
        temp.append(num_dic[t[s]])
if(t[2] != ' ' and t[3] == '0'):
    temp.append('万')
print(t)
for s in range(4,8):
    if t[s] != ' ' and t[s] != '0':
        temp.append(num_dic[t[s]])
        temp.append(unit_dic[s])
    if t[s] == '0' and s <7 and t[s+1] != '0':
        temp.append(num_dic[t[s]])
temp = ''.join(temp)
if a < 0:
    temp = '负' + temp
if a == 0:
    temp = '零' + temp
print(temp + u'圆')

如上,我觉得自己的思路还是不够宏观,不够清楚,自己想到的是细节的东西,然后有用代码去解决,上面大神的思路要更加大局一点,很清晰,我是通过分类讨论的思路,而大神是通过检测增添的思路。

下面这个10行代码更是十分暴力,只能说其中enumerate()和zip()函数学到了,膜拜膜拜。

digit = [u'零',u'壹',u'贰',u'叁',u'肆',u'伍',u'陆',u'柒',u'捌',u'玖']
weight = [u'圆',u'拾',u'佰',u'仟',u'万',u'拾',u'佰',u'仟']
Z = [(u'零仟',u'零佰',u'零拾',u'零零零',u'零零',u'零万',u'零圆'),(u'零',u'零',u'零',u'零',u'零',u'万',u'圆')]
num = str(abs(a))		# 整数转换成字符串
s = u'负' if a<0 else ''
for i,x in enumerate(num):
	s += digit[int(x)] + weight[len(num)-i-1]
for z,v in zip(Z[0],Z[1]):
	s = s.replace(z,v)
print u'零圆' if a==0 else s

相关阅读

PDF转JPG:嗨格式PDF转换器一键完美转换

PDF转JPG如何转换? 在日常生活和工作时,我们一般都会学习一些文件之间转换的技巧来提高办公效率。尤其是当我们遇到批量转换时,一个

Python3中列表del(),remove(),pop()三个函数

del():删除指定值 del  a[0] remove():移除指定值 a.remove("str") pop()获取并删除指定位置元素 A = ['a','b','c'] # pop

Excel2010中字体简繁转换的操作方法

Excel2010的简繁转换操作和EXCEL2007差不多,但貌似excel2010要比2007稳定多了,几乎未见2010丢失简繁转换功能的。今天,seo实验室小

视觉SLAM十四讲(一)——罗德里格斯转换公式推导

最近在学习SLAM,主要的学习资料为高翔的《视觉SLAM十四讲》,首先安利一下这本书,这本书由浅入的介绍了SLAM的整体结构,算法介绍与实际

js代码,中国标准时间转换为yyyy-MM-dd

'Thu May 12 2016 08:00:00 GMT+0800 (中国标准时间)'--此格式日期无法传到java后台,须格式化,方法如下 var d = new Date('Thu M

分享到:

栏目导航

推荐阅读

热门阅读