鱼C论坛

 找回密码
 立即注册
查看: 1267|回复: 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 编辑
# -*- coding: utf-8 -*-
import re

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

    def split_to_group(self, str_integer):
        len_curr = len(str_integer)
        div, mod = divmod(len_curr, 4)
        result = []

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

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

        result.reverse()
        return result

    def convert_group_item(self, group_item):
        result = ''
        
        len_curr = len(group_item)
        for index in range(len_curr):
            num_value = int(group_item[index])
            location = len_curr-index-1

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

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

        return result.rstrip("零")

    def convert_integer(self, str_integer):
        result = ''
        need_zero = False
        groups = self.split_to_group(str_integer)
        for item, index in groups:            
            if item != '0000':
                if need_zero:
                    result += "零"
                    need_zero = False

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

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

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

        return result

    def convert_currency(self, currency):
        str_currency = str(currency)
        
        if not str_currency:
            return

        integer, decimal = str_currency.split('.')        
        result = self.convert_integer(integer)
        
        if not decimal.strip('0'):
            return result + '整'
        else:
            return result + self.convert_decimal(decimal)    

if __name__=='__main__':
    cc = Current_Currency()
    target = 304005010.08    
    
    print(cc.convert_currency(target))

本帖被以下淘专辑推荐:

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

使用道具 举报

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

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

    def split_to_group(self, str_integer):
        len_curr = len(str_integer)
        div, mod = divmod(len_curr, 4)
        result = []

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

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

        result.reverse()
        return result

    def convert_group_item(self, group_item):
        result = ''
        
        len_curr = len(group_item)
        for index in range(len_curr):
            num_value = int(group_item[index])
            location = len_curr-index-1

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

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

        return result.rstrip("零")

    def convert_integer(self, str_integer):
        result = ''
        need_zero = False
        groups = self.split_to_group(str_integer)
        for item, index in groups:            
            if item != '0000':
                if need_zero:
                    result += "零"
                    need_zero = False

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

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

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

        return result

    def convert_currency(self, currency):
        str_currency = str(currency)
        
        if not str_currency:
            return

        integer, decimal = str_currency.split('.')        
        result = self.convert_integer(integer)
        
        if not decimal.strip('0'):
            return result + '整'
        else:
            return result + self.convert_decimal(decimal)    

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

使用道具 举报

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

你确定正确结果是:叁亿零肆佰萬伍仟壹零拾圆捌分?
我认为正确结果是:叁亿零肆佰萬伍仟壹零拾圆捌分
千和千万之前不读零的。
numch = ["零","壹","贰","叁","肆","伍","陆","柒","捌","玖"]
rmbqian = ["","拾","佰","仟"]
rmbpian = ["","萬","亿"]
#10000以内整数进行转换
def qian_exc(str1):
    num=int(str1)
    result=''
    k=0
    while num:
        a=num%10
        num=num//10
        if a!=0:
            result=rmbqian[k]+result
        result=numch[a]+result
        k+=1
    result=result.strip('零')
    if result.count('零')>1:
        result=result.replace('零','',1)
    if int(str1)<1000:
        result='零'+result
    return result
#将整数部分进行转换
def yuan_exc(str_yuan):
    yuan=[]
    while str_yuan:
        yuan.append(str_yuan[-4:])
        str_yuan=str_yuan[:-4]
    readwords='圆'
    for i in range(len(yuan)):
        piece=qian_exc(yuan[i])
        if piece!='零':
            readwords = rmbpian[i] + readwords
            readwords = piece + readwords
    if readwords[0]=='零':
        readwords=readwords[1:]
    readwords= readwords.replace('零零','零')
    if readwords[-2]=='零':
        readwords=readwords[:-2]+'圆'
    return readwords
#将小数部分进行转换
def fen_exc(fen):
    fen_words=''
    if fen!=0:        #不是零分的时候进行转换
        fen_p=fen%10
        fen_b=fen//10
        if fen_p!=0:
            fen_words=numch[fen_p]+'分'
        if fen_b!=0:
            fen_words=numch[fen_b]+'角'+fen_words
    return fen_words

fen=0
fen_words=''
yuan_words=''
l=1
str1=input('请输入:')
while l: #保证输入正确
    l=0
    try:
        f=float(str1)
        if f<0:
            str1=input('请输入一个正数:')
            l=1
    except:
        str1=input('有错误字符,请重新输入:')
temp=str1.split('.')    #以小数点切片,分为整数部分和小数部分
if len(temp)==2:
    l=len(temp[1])          #小数部分长度,若多于两位会进行四舍五入
    if l>0:
        fen=round(int(temp[1])/(10**(l-2))) #小数部分四舍五入到100以内
    if fen==100:            #小数部分转换后为100分,需要进位,整数部分加一
        hudr=True
        temp[0]=str(int(temp[0])+1)
    else:
        fen_words=fen_exc(fen)
if temp[0]!='0' and temp[0]!='':            #整数部分不为0,进行转换
    yuan_words=yuan_exc(temp[0])
say_words=yuan_words+fen_words  #整数部分和小数部分进行拼接
if say_words=='':               #输入为0时,say_words==''
    say_words='零圆'
if fen_words=='':               #若没有小数部分,在最后添加“整”
    say_words=say_words+'整'
if l>2:                 #若进行过四舍五入,则进行说明
    print('输入小数多于两位,四舍五入后约:'+say_words)
else:
    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
import cn2an

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

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-9-21 09:08

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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