0
点赞
收藏
分享

微信扫一扫

python大写金额算法

禾木瞎写 2022-03-11 阅读 80

大写金额算法在网上也有很多,但是试了好多都有这儿那儿的问题,于是本仙穿越时空回到小学,重新审视大写金额的规则,发现了其中各种花里呼哨的大写奥秘,于是本仙施法让计算机瞬间学习大写规则。

本仙采用面向对象仙术施展仙法,念完咒语class一个对象就产生了。

class BigNum(object):
    pass

一、给计算机硬塞几颗仙丹,让计算机快速认识阿拉伯数字与中文大写数字的对应关系,同时学会数位汉字和货币单位汉字。

class BigNum(object):
    # 定义大写数字字典
    dxzd = {
        '.':'点',
        '0':'零',
        '1':'壹',
        '2':'贰',
        '3':'叁',
        '4':'肆',
        '5':'伍',
        '6':'陆',
        '7':'柒',
        '8':'捌',
        '9':'玖'}
    # 定义数位列表
    swlb = [
        '元','拾','佰','仟','万',
        '拾','佰','仟','亿',
        '拾','佰','仟']
    # 定义货币单位
    hbdw = [
        '分','角','元']
    # 定义初始化方法
    def __init__(self,num):
        self.dxzd = BigNum.dxzd
        self.swlb = BigNum.swlb
        self.hbdw = BigNum.hbdw
        self.num = num

二、采用仙术让计算机学会四舍五入

python3似乎自带此仙术,可是会发现此仙术不太灵通

>>> print(round(1.055,2))
1.05

自定义四舍五入仙术

    # 定义四舍五入方法
    def sswr(self,num,n):
        # 如果第n-1位上的数值小于5
        if int(num*(10**(n+1)))-int(num*(10**(n)))*10 < 5:
            # 直接舍弃第n-1位上的值
            return int(num*(10**(n)))/(10**(n))
        # 否则
        else:
            # 舍弃第n-1位上的值,并且第n位上的值+1
            return int(num*(10**(n))+1)/(10**(n))

三、采用仙术让计算机先学会收据上的那种大写规则

    # 大写金额
    def dxje(self):
        # 金额小写拆分
        numlist = list(str(self.sswr(self.num,2)))
        # 转换大写数字
        numlist = [self.dxzd[i] for i in numlist]
        # 连接大写数字
        numstr = ''.join(numlist)
        # 整数部分连接金额
        zsbf = numstr.rpartition('点')[0]
        n = len(zsbf)
        self.zsdx = ''
        for i in range(n):
            self.zsdx = self.zsdx + zsbf[i]
            # print(zsbf[i],end='')
            self.zsdx = self.zsdx + self.swlb[n-i-1]
            # print(swlb[n-i-1],end='')
        # 小数部分
        xsbf = numstr.rpartition('点')[2]
        if len(xsbf) == 1:
            xsbf += '零'
        # print(xsbf)
        n = len(xsbf)
        self.xsdx = ''
        for i in range(n):
            self.xsdx = self.xsdx + xsbf[i]
            # print(xsbf[i],end='')
            self.xsdx = self.xsdx + self.hbdw[n-i-1]
            # print(hbdw[n-i-1],end='')

四、采用递归仙术处理零

    # 清理重复零值
    def xclz(self,numstr):
        # 如果没有重复零值
        if re.findall('零\w零',numstr) == []:
            # 返回结果
            if numstr[-1] == '零':
                return numstr[0:-1]
            else:
                return numstr
        # 否则
        else:
            # 递归清除零值
            return self.xclz(
                numstr.replace(
                    re.findall(
                        '零\w零',numstr)[0],'零'))

五、综合施展仙术

import re
class BigNum(object):
    # 定义大写数字字典
    dxzd = {
        '.':'点',
        '0':'零',
        '1':'壹',
        '2':'贰',
        '3':'叁',
        '4':'肆',
        '5':'伍',
        '6':'陆',
        '7':'柒',
        '8':'捌',
        '9':'玖'}
    # 定义数位列表
    swlb = [
        '元','拾','佰','仟','万',
        '拾','佰','仟','亿',
        '拾','佰','仟']
    # 定义货币单位
    hbdw = [
        '分','角','元']
    # 定义初始化方法
    def __init__(self,num):
        self.dxzd = BigNum.dxzd
        self.swlb = BigNum.swlb
        self.hbdw = BigNum.hbdw
        self.num = num
    # 定义四舍五入方法
    def sswr(self,num,n):
        # 如果第n-1位上的数值小于5
        if int(num*(10**(n+1)))-int(num*(10**(n)))*10 < 5:
            # 直接舍弃第n-1位上的值
            return int(num*(10**(n)))/(10**(n))
        # 否则
        else:
            # 舍弃第n-1位上的值,并且第n位上的值+1
            return int(num*(10**(n))+1)/(10**(n))
    # 清理重复零值
    def xclz(self,numstr):
        # 如果没有重复零值
        if re.findall('零\w零',numstr) == []:
            # 返回结果
            if numstr[-1] == '零':
                return numstr[0:-1]
            else:
                return numstr
        # 否则
        else:
            # 递归清除零值
            return self.xclz(
                numstr.replace(
                    re.findall(
                        '零\w零',numstr)[0],'零'))
    # 大写金额
    def dxje(self):
        # 金额小写拆分
        numlist = list(str(self.sswr(self.num,2)))
        # 转换大写数字
        numlist = [self.dxzd[i] for i in numlist]
        # 连接大写数字
        numstr = ''.join(numlist)
        # 整数部分连接金额
        zsbf = numstr.rpartition('点')[0]
        n = len(zsbf)
        self.zsdx = ''
        for i in range(n):
            self.zsdx = self.zsdx + zsbf[i]
            # print(zsbf[i],end='')
            self.zsdx = self.zsdx + self.swlb[n-i-1]
            # print(swlb[n-i-1],end='')
        # print(self.zsdx)
        # 整数部分清除零值
        li = ['万','亿']
        for i in li:
            self.zsdx = self.zsdx.replace(i,'&')
        numlist = self.zsdx[0:-1].split('&')
        numlist = [self.xclz(i) for i in numlist]
        # print(numlist)
        # 整数部分加回单位
        n = len(numlist)
        li = ['元','万','亿']
        self.zsdx = ''
        for i in range(n):
            self.zsdx = self.zsdx + numlist[i]
            # print(numlist[i],end='')
            self.zsdx = self.zsdx + li[n-i-1]
        #     print(li[n-i-1],end='')
        # print(self.zsdx)
        # # 清理零值后面的数位
        li = ['零仟','零佰','零拾']
        for i in li:
            self.zsdx = self.zsdx.replace(i,'零')
        self.zsdx = self.zsdx.replace('亿万','亿零')
        # print(self.zsdx)
        # 小数部分
        xsbf = numstr.rpartition('点')[2]
        if len(xsbf) == 1:
            xsbf += '零'
        # print(xsbf)
        n = len(xsbf)
        self.xsdx = ''
        for i in range(n):
            self.xsdx = self.xsdx + xsbf[i]
            # print(xsbf[i],end='')
            self.xsdx = self.xsdx + self.hbdw[n-i-1]
            # print(hbdw[n-i-1],end='')
        if self.xsdx == '零角零分':
            self.xsdx = '整'
        elif self.xsdx[-2:] == '零分':
            self.xsdx = self.xsdx[0:2]+'整'
        elif self.xsdx[0:2] == '零角':
            self.xsdx = '零'+self.xsdx[-2:]
    def __str__(self):
        return self.zsdx + self.xsdx
def rmbdx(num):
    bignum = BigNum(num)
    bignum.dxje()
    return bignum.zsdx + bignum.xsdx
def main():
    print(rmbdx(5600030800.9896))
    print(rmbdx(5000030800.9896))
if __name__ == '__main__':
    main()
   
output:
伍拾陆亿零叁万零捌佰元玖角玖分
伍拾亿零叁万零捌佰元玖角玖分

 这是本仙在CSDN上首次施法,望各位也使用仙法点赞加转发加收藏加测试加质疑。本仙会不定期回复。

举报

相关推荐

0 条评论