鱼C论坛

 找回密码
 立即注册
查看: 1140|回复: 7

[已解决]数字金额转换问题,如何去除元部分的零?,在原代码上修改

[复制链接]
发表于 2020-1-13 22:07:55 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 随便找找看看 于 2020-1-15 19:59 编辑

# 输入304005010.08,如何将输出结果:‘叁亿零仟肆佰零拾零萬伍仟零佰壹拾零圆捌分’   中的 零圆,零拾、零佰、零仟、、零萬、零亿。这些转换成正确的值   
# 正确结果:叁亿零肆佰萬零伍仟壹零拾圆零捌分
# 是否可以在源代码上修改。

num = ["壹","贰","叁","肆","伍","陆","柒","捌","玖","零"]
rmbdw = ["圆","拾","佰","仟","萬","拾","佰","仟","亿","拾","佰","仟"]
empty =''
while True:
    yuan = []
    jiao = []
    rmb = input("请输入任意一个金额:")
    if rmb == empty:
        break
    else:
        rmb1 = rmb.split('.')
        if int(rmb1[0]) >= 1 and len(rmb1) <= 1:
            a = len(rmb1[0])-1
            for i in list(rmb1[0]):
                j = int(i)
                yuan.append(num[j-1])                    
                yuan.append(rmbdw[a])
                a = a - 1
            print ("" .join(yuan) + '整')
        elif int(rmb1[0]) >= 0 and len(rmb1) > 1:
            a = len(rmb1[0])-1
            for i in list(rmb1[0]):
                j = int(i)
                yuan.append(num[j-1])
                yuan.append(rmbdw[a])
                a = a - 1
            if len(rmb1[1]) == 1:
                jiao.append(num[int(rmb1[1])-1] + '角')
            if len(rmb1[1]) == 2 and int(rmb1[1][0]) != 0 :
                jiao.append(num[int(rmb1[1][0])-1] + '角' + num[int(rmb1[1][1])-1] + '分')
            if len(rmb1[1]) == 2 and int(rmb1[1][0]) == 0 :
                jiao.append(num[int(rmb1[1][1])-1] + '分')
               
            print("".join(yuan + jiao))
   
input('')
最佳答案
2020-1-14 00:49:22
本帖最后由 XiaoPaiShen 于 2020-1-16 04:15 编辑
  1. # -*- coding: utf-8 -*-
  2. import re

  3. class Current_Currency:
  4.     def __init__(self):
  5.         self.chn_numb = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  6.         self.num_unit = ["", "拾", "佰", "仟"]
  7.         self.group_unit = ["","萬","亿", "兆"]
  8.         self.rmb_unit = ['圆', '角', '分']

  9.     def split_to_group(self, str_integer):
  10.         len_curr = len(str_integer)
  11.         div, mod = divmod(len_curr, 4)
  12.         result = []

  13.         for index in range(div):
  14.             start = mod + (div-index-1)*4
  15.             end = start + 4
  16.             result.append((str_integer[start:end], index))

  17.         if mod:
  18.             result.append((str_integer[0:mod], index+1))

  19.         result.reverse()
  20.         return result

  21.     def convert_group_item(self, group_item):
  22.         result = ''
  23.         
  24.         len_curr = len(group_item)
  25.         for index in range(len_curr):
  26.             num_value = int(group_item[index])
  27.             location = len_curr-index-1

  28.             if num_value:                                
  29.                 result += self.chn_numb[num_value] + self.num_unit[location]

  30.             elif not result or not result[-1] == "零":
  31.                 result += self.chn_numb[num_value]

  32.         return result.rstrip("零")

  33.     def convert_integer(self, str_integer):
  34.         result = ''
  35.         need_zero = False
  36.         groups = self.split_to_group(str_integer)
  37.         for item, index in groups:            
  38.             if item != '0000':
  39.                 if need_zero:
  40.                     result += "零"
  41.                     need_zero = False

  42.                 chn_item = self.convert_group_item(item) + self.group_unit[index]
  43.                 result += chn_item
  44.             else:
  45.                 need_zero = True

  46.         result = re.sub(r'([\u96F6])\1+', r'\1', result)
  47.         return result + self.rmb_unit[0]

  48.     def convert_decimal(self, str_decimal):
  49.         result = ''
  50.         for index, digital in enumerate(str_decimal):
  51.             if int(digital):
  52.                 result += self.chn_numb[int(digital)] + self.rmb_unit[index+1]

  53.         return result

  54.     def convert_currency(self, currency):
  55.         str_currency = str(currency)
  56.         
  57.         if not str_currency:
  58.             return

  59.         integer, decimal = str_currency.split('.')        
  60.         result = self.convert_integer(integer)
  61.         
  62.         if not decimal.strip('0'):
  63.             return result + '整'
  64.         else:
  65.             return result + self.convert_decimal(decimal)   

  66. if __name__=='__main__':
  67.     cc = Current_Currency()
  68.     target = 304005010.08   
  69.    
  70.     print(cc.convert_currency(target))
复制代码

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-1-14 00:49:22 | 显示全部楼层    本楼为最佳答案   
本帖最后由 XiaoPaiShen 于 2020-1-16 04:15 编辑
  1. # -*- coding: utf-8 -*-
  2. import re

  3. class Current_Currency:
  4.     def __init__(self):
  5.         self.chn_numb = ['零', '壹', '贰', '叁', '肆', '伍', '陆', '柒', '捌', '玖']
  6.         self.num_unit = ["", "拾", "佰", "仟"]
  7.         self.group_unit = ["","萬","亿", "兆"]
  8.         self.rmb_unit = ['圆', '角', '分']

  9.     def split_to_group(self, str_integer):
  10.         len_curr = len(str_integer)
  11.         div, mod = divmod(len_curr, 4)
  12.         result = []

  13.         for index in range(div):
  14.             start = mod + (div-index-1)*4
  15.             end = start + 4
  16.             result.append((str_integer[start:end], index))

  17.         if mod:
  18.             result.append((str_integer[0:mod], index+1))

  19.         result.reverse()
  20.         return result

  21.     def convert_group_item(self, group_item):
  22.         result = ''
  23.         
  24.         len_curr = len(group_item)
  25.         for index in range(len_curr):
  26.             num_value = int(group_item[index])
  27.             location = len_curr-index-1

  28.             if num_value:                                
  29.                 result += self.chn_numb[num_value] + self.num_unit[location]

  30.             elif not result or not result[-1] == "零":
  31.                 result += self.chn_numb[num_value]

  32.         return result.rstrip("零")

  33.     def convert_integer(self, str_integer):
  34.         result = ''
  35.         need_zero = False
  36.         groups = self.split_to_group(str_integer)
  37.         for item, index in groups:            
  38.             if item != '0000':
  39.                 if need_zero:
  40.                     result += "零"
  41.                     need_zero = False

  42.                 chn_item = self.convert_group_item(item) + self.group_unit[index]
  43.                 result += chn_item
  44.             else:
  45.                 need_zero = True

  46.         result = re.sub(r'([\u96F6])\1+', r'\1', result)
  47.         return result + self.rmb_unit[0]

  48.     def convert_decimal(self, str_decimal):
  49.         result = ''
  50.         for index, digital in enumerate(str_decimal):
  51.             if int(digital):
  52.                 result += self.chn_numb[int(digital)] + self.rmb_unit[index+1]

  53.         return result

  54.     def convert_currency(self, currency):
  55.         str_currency = str(currency)
  56.         
  57.         if not str_currency:
  58.             return

  59.         integer, decimal = str_currency.split('.')        
  60.         result = self.convert_integer(integer)
  61.         
  62.         if not decimal.strip('0'):
  63.             return result + '整'
  64.         else:
  65.             return result + self.convert_decimal(decimal)   

  66. if __name__=='__main__':
  67.     cc = Current_Currency()
  68.     target = 304005010.08   
  69.    
  70.     print(cc.convert_currency(target))
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-14 14:28:14 | 显示全部楼层
本帖最后由 sunrise085 于 2020-1-15 08:51 编辑

你确定正确结果是:叁亿零肆佰萬伍仟壹零拾圆捌分?
我认为正确结果是:叁亿零肆佰萬伍仟壹零拾圆捌分
千和千万之前不读零的。
  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)
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-14 22:33:35 | 显示全部楼层
sunrise085 发表于 2020-1-14 14:28
你确定正确结果是:叁亿零肆佰萬零伍仟壹零拾圆捌分?
我认为正确结果是:叁亿零肆佰萬伍仟壹零拾圆捌分
...

需要读零的, 有有没有更简单一点, 是否在原的代码上去改进
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-1-14 22:34:53 | 显示全部楼层

是否可以在原代码上进行修改呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-14 22:43:52 From FishC Mobile | 显示全部楼层
本帖最后由 XiaoPaiShen 于 2020-1-14 23:04 编辑

pip install cn2an

  1. import cn2an

  2. target= 304005010.08
  3. result = cn2an.an2cn(target, "rmb")

  4. print(result)
复制代码



# 程序结果:叁亿零肆佰万零伍仟零壹拾元零捌分
# 你的答案:叁亿零肆佰萬零伍仟壹零拾圆捌分
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-15 09:01:04 | 显示全部楼层
随便找找看看 发表于 2020-1-14 22:34
是否可以在原代码上进行修改呢?

你的源代码太粗犷了。不值得去修改。改你的程序,付出与收获不成比例.
程序要有容错性,要考虑到可能会出现的各种情况。你的程序可不单单是出现各种零的问题
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-1-15 13:31:46 | 显示全部楼层
我把上面的代码修改了,封装成类,希望能有帮助
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-20 21:11

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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