zoukankan      html  css  js  c++  java
  • 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))
    
    不论你在什么时候开始,重要的是开始之后就不要停止。 不论你在什么时候结束,重要的是结束之后就不要悔恨。
  • 相关阅读:
    康复计划
    Leetcode 08.02 迷路的机器人 缓存加回溯
    Leetcode 38 外观数列
    Leetcode 801 使序列递增的最小交换次数
    Leetcode 1143 最长公共子序列
    Leetcode 11 盛水最多的容器 贪心算法
    Leetcode 1186 删除一次得到子数组最大和
    Leetcode 300 最长上升子序列
    Leetcode95 不同的二叉搜索树II 精致的分治
    Leetcode 1367 二叉树中的列表 DFS
  • 原文地址:https://www.cnblogs.com/yunhgu/p/15180391.html
Copyright © 2011-2022 走看看