鱼C论坛

 找回密码
 立即注册
查看: 1192|回复: 5

[已解决]python编写金额小写转大写,关于过亿的怎么写??

[复制链接]
发表于 2020-5-22 16:33:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 1809228982 于 2020-5-22 16:36 编辑

代码单位过拾万的都有点乱了,过亿的要咋弄呢?有帮优化的吗


  1. import os #清屏使用

  2. unit = ['万', '仟', '佰', '拾', '']
  3. rmb = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  4. rmb_point = ['角', '分']
  5. while True:
  6.    
  7.     number = input("请输入金额(输入Q退出):")
  8.     if number == 'Q' or number == 'q':
  9.         break;
  10.     try:
  11.         float(number)
  12.     except ValueError as exc:
  13.         print("\n请输入正确的数字!\n")
  14.     else:
  15.         point_flag = False #初始化小数点
  16.         
  17.         #检查是否含有小数点
  18.         if '.' in number:
  19.             (number, point_right) = number.split('.')
  20.             point_flag = True
  21.             point_right_len = len(point_right)
  22.             
  23.         if len(number) > 8:
  24.             os.system('cls')
  25.             print("\t\t-----------------------------------")
  26.             print("\t\t   错误!暂不支持过亿的单位换算!")
  27.             print("\t\t-----------------------------------")
  28.             print('\n\n\n\n\n\n\n')
  29.             exit()
  30.             
  31.         zero_flag = True  #判断是否去除多余的零
  32.         
  33.         rmb_upper = '大写:'

  34.         lenght = len(number)#初始化数字(小数点左边的数字)的长度
  35.         
  36.         wan_lenght = 0 #初始化万单位的数字长度
  37.         
  38.         unit_flag = 5 - lenght #初始化单位
  39.         
  40.         begin = 0 #初始化开始的位置

  41.         #检查数字是否超过万单位,如果查过则重新为各项数据赋值
  42.         wan_flag = False
  43.         if lenght > 5:
  44.             wan_lenght = 9 - lenght
  45.             unit_flag = 1
  46.             wan_flag = True
  47.             begin = lenght - 4

  48.         #进行超万单位的转换
  49.         if wan_flag:
  50.             for i in range(5 - wan_lenght):
  51.                 if number[i] == '0':
  52.                     zero_flag = False
  53.                 else:
  54.                     if not zero_flag:
  55.                         rmb_upper += rmb[0]
  56.                         zero_flag = True
  57.                     rmb_upper += rmb[int(number[i])] + unit[wan_lenght]
  58.                 wan_lenght += 1
  59.             rmb_upper += '万'
  60.             
  61.         #进行万及以下单位的转换
  62.         for i in range(begin, lenght):
  63.             if number[i] == '0':
  64.                 zero_flag = False
  65.             else:
  66.                 if not zero_flag:
  67.                     rmb_upper += rmb[0]
  68.                     zero_flag = True
  69.                 rmb_upper += rmb[int(number[i])] + unit[unit_flag]
  70.             unit_flag += 1

  71.         #转换小数点右边的数字
  72.         if not point_flag or not point_right:
  73.             rmb_upper += '元整'
  74.         else:
  75.             if point_right[0] != '0':
  76.                 if point_right_len == 1:
  77.                     rmb_upper += '元' + rmb[int(point_right[0])] + rmb_point[0]
  78.                 else:
  79.                     rmb_upper += '元' + rmb[int(point_right[0])] + rmb_point[0] + rmb[int(point_right[1])] + rmb_point[1]
  80.             else:
  81.                 if point_right_len == 1 or (point_right_len ==2 and point_right[1] == '0'):
  82.                     rmb_upper += '元整'
  83.                 else:
  84.                     rmb_upper += '元' + rmb[0] + rmb[int(point_right[1])] + rmb_point[1]

  85.         #输出
  86.         for i in range(2):
  87.             print()
  88.             
  89.         print(rmb_upper)

  90.         for i in range(3):
  91.             print()
复制代码
最佳答案
2020-5-22 17:29:19
本帖最后由 sunrise085 于 2020-5-22 17:33 编辑

这个是我之前写的金额转换。可以高达万亿
  1. numch = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
  2. rmbqian = ["","拾","佰","仟"]
  3. rmbpian = ["","萬","亿","萬"]
  4. #10000以内整数进行转换
  5. def qian_exc(str1):
  6.     num=int(str1)
  7.     result=''
  8.     k=0
  9.     while num:
  10.         a=num%10
  11.         num=num//10
  12.         if a!=0:
  13.             result=rmbqian[k]+result
  14.         result=numch[a]+result
  15.         k+=1
  16.     result=result.strip('零')
  17.     if result.count('零')>1:
  18.         result=result.replace('零','',1)
  19.     if int(str1)<1000:
  20.         result='零'+result
  21.     return result
  22. #将整数部分进行转换
  23. def yuan_exc(str_yuan):
  24.     yuan=[]
  25.     while str_yuan:
  26.         yuan.append(str_yuan[-4:])
  27.         str_yuan=str_yuan[:-4]
  28.     readwords='圆'
  29.     for i in range(len(yuan)):
  30.         piece=qian_exc(yuan[i])
  31.         if piece!='零':
  32.             readwords = rmbpian[i] + readwords
  33.             readwords = piece + readwords
  34.     if readwords[0]=='零':
  35.         readwords=readwords[1:]
  36.     readwords= readwords.replace('零零','零')
  37.     if readwords[-2]=='零':
  38.         readwords=readwords[:-2]+'圆'
  39.     return readwords
  40. #将小数部分进行转换
  41. def fen_exc(fen):
  42.     fen_words=''
  43.     if fen!=0:        #不是零分的时候进行转换
  44.         fen_p=fen%10
  45.         fen_b=fen//10
  46.         if fen_p!=0:
  47.             fen_words=numch[fen_p]+'分'
  48.         if fen_b!=0:
  49.             fen_words=numch[fen_b]+'角'+fen_words
  50.     return fen_words

  51. fen=0
  52. fen_words=''
  53. yuan_words=''
  54. l=1
  55. str1=input('请输入:')
  56. while l: #保证输入正确
  57.     l=0
  58.     try:
  59.         f=float(str1)
  60.         if f<0:
  61.             str1=input('请输入一个正数:')
  62.             l=1
  63.     except:
  64.         str1=input('有错误字符,请重新输入:')
  65. temp=str1.split('.')    #以小数点切片,分为整数部分和小数部分
  66. if len(temp)==2:
  67.     l=len(temp[1])          #小数部分长度,若多于两位会进行四舍五入
  68.     if l>0:
  69.         fen=round(int(temp[1])/(10**(l-2))) #小数部分四舍五入到100以内
  70.     if fen==100:            #小数部分转换后为100分,需要进位,整数部分加一
  71.         hudr=True
  72.         temp[0]=str(int(temp[0])+1)
  73.     else:
  74.         fen_words=fen_exc(fen)
  75. if temp[0]!='0' and temp[0]!='':            #整数部分不为0,进行转换
  76.     yuan_words=yuan_exc(temp[0])
  77. say_words=yuan_words+fen_words  #整数部分和小数部分进行拼接
  78. if say_words=='':               #输入为0时,say_words==''
  79.     say_words='零圆'
  80. if fen_words=='':               #若没有小数部分,在最后添加“整”
  81.     say_words=say_words+'整'
  82. if l>2:                 #若进行过四舍五入,则进行说明
  83.     print('输入小数多于两位,四舍五入后约:'+say_words)
  84. else:
  85.     print(say_words)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-5-22 16:36:09 | 显示全部楼层
我看错了,我谢罪
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-22 16:40:23 | 显示全部楼层
Twilight6 发表于 2020-5-22 16:36
我看错了,我谢罪

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-22 16:40:29 | 显示全部楼层
Twilight6 发表于 2020-5-22 16:36
我看错了,我谢罪

我看错了,我开花

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
Twilight6 + 2 + 2 哈哈哈

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-22 17:29:19 | 显示全部楼层    本楼为最佳答案   
本帖最后由 sunrise085 于 2020-5-22 17:33 编辑

这个是我之前写的金额转换。可以高达万亿
  1. numch = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
  2. rmbqian = ["","拾","佰","仟"]
  3. rmbpian = ["","萬","亿","萬"]
  4. #10000以内整数进行转换
  5. def qian_exc(str1):
  6.     num=int(str1)
  7.     result=''
  8.     k=0
  9.     while num:
  10.         a=num%10
  11.         num=num//10
  12.         if a!=0:
  13.             result=rmbqian[k]+result
  14.         result=numch[a]+result
  15.         k+=1
  16.     result=result.strip('零')
  17.     if result.count('零')>1:
  18.         result=result.replace('零','',1)
  19.     if int(str1)<1000:
  20.         result='零'+result
  21.     return result
  22. #将整数部分进行转换
  23. def yuan_exc(str_yuan):
  24.     yuan=[]
  25.     while str_yuan:
  26.         yuan.append(str_yuan[-4:])
  27.         str_yuan=str_yuan[:-4]
  28.     readwords='圆'
  29.     for i in range(len(yuan)):
  30.         piece=qian_exc(yuan[i])
  31.         if piece!='零':
  32.             readwords = rmbpian[i] + readwords
  33.             readwords = piece + readwords
  34.     if readwords[0]=='零':
  35.         readwords=readwords[1:]
  36.     readwords= readwords.replace('零零','零')
  37.     if readwords[-2]=='零':
  38.         readwords=readwords[:-2]+'圆'
  39.     return readwords
  40. #将小数部分进行转换
  41. def fen_exc(fen):
  42.     fen_words=''
  43.     if fen!=0:        #不是零分的时候进行转换
  44.         fen_p=fen%10
  45.         fen_b=fen//10
  46.         if fen_p!=0:
  47.             fen_words=numch[fen_p]+'分'
  48.         if fen_b!=0:
  49.             fen_words=numch[fen_b]+'角'+fen_words
  50.     return fen_words

  51. fen=0
  52. fen_words=''
  53. yuan_words=''
  54. l=1
  55. str1=input('请输入:')
  56. while l: #保证输入正确
  57.     l=0
  58.     try:
  59.         f=float(str1)
  60.         if f<0:
  61.             str1=input('请输入一个正数:')
  62.             l=1
  63.     except:
  64.         str1=input('有错误字符,请重新输入:')
  65. temp=str1.split('.')    #以小数点切片,分为整数部分和小数部分
  66. if len(temp)==2:
  67.     l=len(temp[1])          #小数部分长度,若多于两位会进行四舍五入
  68.     if l>0:
  69.         fen=round(int(temp[1])/(10**(l-2))) #小数部分四舍五入到100以内
  70.     if fen==100:            #小数部分转换后为100分,需要进位,整数部分加一
  71.         hudr=True
  72.         temp[0]=str(int(temp[0])+1)
  73.     else:
  74.         fen_words=fen_exc(fen)
  75. if temp[0]!='0' and temp[0]!='':            #整数部分不为0,进行转换
  76.     yuan_words=yuan_exc(temp[0])
  77. say_words=yuan_words+fen_words  #整数部分和小数部分进行拼接
  78. if say_words=='':               #输入为0时,say_words==''
  79.     say_words='零圆'
  80. if fen_words=='':               #若没有小数部分,在最后添加“整”
  81.     say_words=say_words+'整'
  82. if l>2:                 #若进行过四舍五入,则进行说明
  83.     print('输入小数多于两位,四舍五入后约:'+say_words)
  84. else:
  85.     print(say_words)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-25 08:21:59 | 显示全部楼层
sunrise085 发表于 2020-5-22 17:29
这个是我之前写的金额转换。可以高达万亿

感谢感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-25 13:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表