python数字转换成大写中文格式
来源
今天在写老师留下的一个作业的时候发现这道题还挺有意思,题目描述是这样:编写程序,根据用户输入的数字转换成相应的中文的大写数字。例如,1.23转换为“壹点贰叁”。
思路
小数点前后分开处理。
小数点后的直接一个一个变换即可,再把有无小数点分开讨论。
解决
参考
第一,字典对照处理
#数字对照
#使用字符串格式方便对照变换
s_duizhao = {
'0':"零",'1':"壹",'2':"贰",'3':"叁",'4':"肆",
'5':"伍",'6':"陆",'7':"柒",'8':"捌",'9':"玖"
}
#单位对照
#单位通过flag标志位置进行添加
s_danwei = {
0:'',1:'十',2:'百',3:'千',4:'万',8:'亿'
}
详细解决方式
(不会写博客,直接代码加注释QAQ)
#首先分别处理有无小数点
if '.' in s :#有小数点的情况
#分为两段字符串
s_1 = s[0:s.find('.')]
s_2 = s[s.find('.')+1:]
flag_1 = 0 #定位当前变化字符位置,方便添加单位
s_1 = s_1[::-1]#因为数串正序从大到小不好判断所以先倒序,变换完成后再逆序一次即可。
re_re = "" #结果字串
for i in s_1:
#不是第一位,加入 万 或者 亿
if flag_1 != 0 and flag_1 % 4 == 0:
re_re += s_danwei[flag_1]
#习惯,在0的时候不带单位
if i != '0':
re_re += s_danwei[flag_1 % 4]
#因为是逆序数字串,所以要先添加单位再添加更改后的数字
re_re += s_duizhao[i]
flag_1 += 1
re_re = re_re[::-1]#逆序结果字串
re_re += '点'
for i in s_2:#添加小数点后的部分
re_re += s_duizhao[i]
else: #没有小数点的数字
s_1 = s
s_1 = s_1[::-1]
flag_1 = 0
re_re = ""
for i in s_1:
if flag_1 != 0 and flag_1 % 4 == 0:
re_re += s_danwei[flag_1]
if i != '0':
re_re += s_danwei[flag_1 % 4]
re_re += s_duizhao[i]
flag_1 += 1
re_re = re_re[::-1]
注:特殊情况处理
1、两位数
一般两位数的时候,比如12读成十二而不是一十二。
so:
#当第二个字符是十的时候 无论是大单位十二万还是十二 都把一给舍去
if re_re[1] == '十' and re_re[0] == '一':
re_re = re_re[1:]
2、个位数上的零在不单独出现的时候不读
so:
#是0则删除最后一位(来自前方引用的大佬)
if re_re.endswith('零') and len(re_re)>1:
re_re = re_re[:-1]
3、连续的零
比如3001,在大写中不会是三千零零一
所以重复的零要删去。
== !!!==注意:大佬的删零有误。
#中文数字没有连续的零
while "零零" in re_re:
re_re = re_re.replace("零零","零")
最终代码
#小数点前最大到千亿 可继续增加
s = input("请输入数字:")
s_duizhao = {
'0':"零",'1':"壹",'2':"贰",'3':"叁",'4':"肆",
'5':"伍",'6':"陆",'7':"柒",'8':"捌",'9':"玖"
}
s_danwei = {
0:'',1:'十',2:'百',3:'千',4:'万',8:'亿'
}
re_re = ""
if '.' in s :
s_1 = s[0:s.find('.')]
s_2 = s[s.find('.')+1:]
flag_1 = 0
s_1 = s_1[::-1]
for i in s_1:
if flag_1 != 0 and flag_1 % 4 == 0:
re_re += s_danwei[flag_1]
if i != '0':
re_re += s_danwei[flag_1 % 4]
re_re += s_duizhao[i]
flag_1 += 1
re_re = re_re[::-1]
while re_re.endswith('零') and len(re_re)>1:
re_re = re_re[:-1]
# 中文数字没有连续的零
while "零零" in re_re:
re_re = re_re.replace("零零", "零")
re_re += '点'
for i in s_2:
re_re += s_duizhao[i]
else:
s_1 = s
s_1 = s_1[::-1]
flag_1 = 0
for i in s_1:
if flag_1 != 0 and flag_1 % 4 == 0:
re_re += s_danwei[flag_1]
if i != '0':
re_re += s_danwei[flag_1 % 4]
re_re += s_duizhao[i]
flag_1 += 1
re_re = re_re[::-1]
while re_re.endswith('零') and len(re_re)>1:
re_re = re_re[:-1]
# 中文数字没有连续的零
while "零零" in re_re:
re_re = re_re.replace("零零", "零")
if re_re[1] == '十' and re_re[0] == '一':
re_re = re_re[1:]
print(re_re)
再见再见。
QAQ