python将阿拉伯数字转换为中文书写的数字形式

部署运行你感兴趣的模型镜像

#! /usr/bin/env python
# -*- coding: utf-8 -*-#

# -------------------------------------------------------------------------------
# Name:         num2chinese
# Author:       yunhgu
# Date:         2021/8/24 14:51
# Description: 
# -------------------------------------------------------------------------------

_MAPPING = (u'零', u'一', u'二', u'三', u'四', u'五', u'六', u'七', u'八', u'九',)
_P0 = (u'', u'十', u'百', u'千',)
_S4, _S8, _S16 = 10 ** 4, 10 ** 8, 10 ** 16
_MIN, _MAX = 0, 9999999999999999


class NotIntegerError(Exception):
    pass


class OutOfRangeError(Exception):
    pass


class Num2Chinese:
    def convert(self, number: int):
        """
        :param number:
        :return:chinese number
        """
        return self._to_chinese(number)

    def _to_chinese(self, num):
        if not str(num).isdigit():
            raise NotIntegerError(u'%s is not a integer.' % num)
        if num < _MIN or num > _MAX:
            raise OutOfRangeError(u'%d out of range[%d, %d)' % (num, _MIN, _MAX))
        if num < _S4:
            return self._to_chinese4(num)
        elif num < _S8:
            return self._to_chinese8(num)
        else:
            return self._to_chinese16(num)

    @staticmethod
    def _to_chinese4(num):
        assert (0 <= num < _S4)
        if num < 10:
            return _MAPPING[num]
        else:
            lst = []
            while num >= 10:
                lst.append(num % 10)
                num = num // 10
            lst.append(num)
            c = len(lst)  # 位数
            result = u''
            for idx, val in enumerate(lst):
                if val != 0:
                    result += _P0[idx] + _MAPPING[val]
                    if idx < c - 1 and lst[idx + 1] == 0:
                        result += u'零'
            return result[::-1].replace(u'一十', u'十')

    def _to_chinese8(self, num):
        assert (num < _S8)
        to4 = self._to_chinese4
        if num < _S4:
            return to4(num)
        else:
            mod = _S4
            high, low = num // mod, num % mod
            if low == 0:
                return to4(high) + u'万'
            else:
                if low < _S4 // 10:
                    return to4(high) + u'万零' + to4(low)
                else:
                    return to4(high) + u'万' + to4(low)

    def _to_chinese16(self, num):
        assert (num < _S16)
        to8 = self._to_chinese8
        mod = _S8
        high, low = num // mod, num % mod
        if low == 0:
            return to8(high) + u'亿'
        else:
            if low < _S8 // 10:
                return to8(high) + u'亿零' + to8(low)
            else:
                return to8(high) + u'亿' + to8(low)


if __name__ == '__main__':
    num2chinese = Num2Chinese()
    print(num2chinese.convert(58748748))
不论你在什么时候开始,重要的是开始之后就不要停止。 不论你在什么时候结束,重要的是结束之后就不要悔恨。

您可能感兴趣的与本文相关的镜像

Python3.11

Python3.11

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大富大贵7

很高兴能够帮助到你 感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值