python数字转换成大写中文格式

来源

今天在写老师留下的一个作业的时候发现这道题还挺有意思,题目描述是这样:编写程序,根据用户输入的数字转换成相应的中文的大写数字。例如,1.23转换为“壹点贰叁”。

思路

小数点前后分开处理。
小数点后的直接一个一个变换即可,再把有无小数点分开讨论。

解决

参考

小技巧2:Python 实现阿拉伯数字转化为中文数字

第一,字典对照处理

#数字对照
#使用字符串格式方便对照变换
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

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值