python数字转换成中文/数字转换成汉字

import re, time


class ConvertNumber:
    # 主程序
    def ranki(self, num):
        rank = []
        for i in [num]:
            i = self.turn(i)
            rank.append(i)
        return rank[0]

    # 如果超过万,则分为两部分以节约代码和运行速度
    def turn(self, x):
        i = str(x)

        if len(i) > 8:
            i = self.tran(i[0:-8]) + '亿' + self.tran(i[-8:])
        elif len(i) > 4:
            i = self.tran(i[0:-4]) + '万' + self.tran(i[-4:])
        else:
            i = self.tran(i[-4:])
        return i

    # 转换数字并插入对应单位,单位为‘零’则再插入一个‘零’以方便正则表达式替换
    def tran(self, x):
        num = ['零', '一', '二', '三', '四', '五', '六', '七', '八', '九']
        kin = ['零', '十', '百', '千']
        x = list(reversed(x))
        for i in x:
            x[(x.index(i))] = num[int(i)]
        if len(x) >= 2:
            if x[1] == num[0]:
                x.insert(1, kin[0])
            else:
                x.insert(1, kin[1])
            if len(x) >= 4:
                if x[3] == num[0]:
                    x.insert(3, kin[0])
                else:
                    x.insert(3, kin[2])
                if len(x) >= 6:
                    if x[5] == num[0]:
                        x.insert(5, kin[0])
                    else:
                        x.insert(5, kin[3])
        x = self.delz(x)
        return x

    # 进行多余‘零’的删除
    # reversed()函数真是可以用在列表和字符串。
    # 加上 if 语句 防止对不必要的数据进行正则表达式检测
    def delz(self, x):
        x = ''.join(x)
        if '零零' in x:
            x = re.sub('零+', '零', x)
        if x.startswith('零'):
            x = list(x)
            x.remove('零')
        x = reversed(x)
        x = ''.join(x)
        return x


    def main(self, num):
        num = str(num)
        if len(num) > 8:
            last_8 = num[-8:]

            strip_num = last_8.lstrip('0')
            
            after_8 = self.ranki(strip_num)
            front, _ = self.ranki(num).split('亿')
            
            if len(strip_num) < 8:
                return f"{front}亿零{after_8}"
            else:
                return f"{front}亿{after_8}"
        else:
            res = self.ranki(num)
            return res

if __name__ == '__main__':
    con = ConvertNumber()
    print(con.main(110001001))

引自

你可能感兴趣的:(python数字转换成中文/数字转换成汉字)