阿拉伯數字轉中文大寫(金額)


輸入:阿拉伯數字(float或int型)
輸出:金額的中文大寫(字符串)


    首先利用字符串的maketrans方法將阿拉伯數字與大寫漢字進行映射,然後構造一個從個位到兆位的單位列表,對轉換過後的數字列表進行反向遍歷,依次與單位列表組合,就可以生成諸如(壹仟壹佰壹拾壹萬)的字符串,之後對零項進行處理,這裏我們將整數部分和小數部分分開處理,處理方式一樣

1. 初始化參數

    def __init__(self, num):
        """
        :param num: 用戶傳入的數字
        初始化參數,包括:
        {
            check_num :int/float    用作檢查輸入的數字
            num:str    用作轉換的阿拉伯數字字符串,排除`.00`的情況
            trans_tab:dict    字符映射轉換表
            dec_label:list    小數部分的單位列表
            int_label:list    整數部分的單位列表
            int_string:str    整數部分構成的字符串
            dec_string:str    小數部分構成的字符串
        }
        """
        # 去除00的情況
        self.check_num = num
        self.num = str(num).rstrip('.0')
        self.trans_tab = str.maketrans('0123456789', '零壹貳叄肆伍陸柒捌玖')
        self.dec_label = ['角', '分']
        self.int_label = ['', '拾', '佰', '仟', '萬', '拾', '佰', '千', '億', '拾', '百', '千', '兆']
        self.int_string = ''
        self.dec_string = ''

2. 分離整數部分和小數部分

先調用字符串的translate將數字進行轉換然後根據小數點進行分割

int_part, dec_part = self.num.translate(self.trans_tab).split('.')

3. 處理小數部分

    首先針對小數部分的長度分別處理,然後將之與小數的單位列表按照對應索引組合,組合成類似·壹角壹分·的類型,如果最小位到了分,則需要將零角替換爲零,若只有角則無需處理

# 對小數部分進行處理
if len(dec_part) == 2:
    self.dec_string = ''.join([
        dec_part[i] + self.dec_label[i] for i in range(len(dec_part))
    ]).replace('零角', '零')

else:
    self.dec_string = ''.join([
        dec_part[i] + self.dec_label[i] for i in range(len(dec_part))
    ])

4. 處理整數部分

    這裏注意,對整數部分的處理首先需要逆轉整數數字的列表,從個位數字開始處理,這樣能夠有效的對數字的位數以及大小進行遞增,從個十百千萬依次遞增(最大到兆),將整數部分與整數的單位列表所對應的的索引項相組合,若該數字爲零則將組合後的結果也記爲零,最後我們再將列表逆轉回來並以字符串形式組合,將中間多餘的零去除(若是一萬零零零一則僅保留一個),最後對字符串尾部進行判斷,如果結尾爲零則表示最小位到十位,做補零操作,否則直接添加單位圓

# 處理整數部分
int_part = list(reversed(int_part))
int_list = list(reversed([
    int_part[i] + self.int_label[i] if int_part[i] != '零' else '零' for i in range(len(int_part))
]))
if int_list[-1] == '零':
    self.int_string = re.sub(r'零{2,}', '零', ''.join(int_list)).rstrip('零') + '圓零'
else:
    self.int_string = re.sub(r'零{2,}', '零', ''.join(int_list)).rstrip('零') + '圓'
print(self.int_string + self.dec_string)
  • 如果是浮點數,我們就需要組合兩部分,若僅是純整數,則只用處理整數部分,所以在初始化參數的時候定義了兩個空字符串,這個時候就派上用場了
  • 此外,我們需要判斷一下數據的準確性,是否越界,是否是純整數等等
def data_checker(self):
    """
    判斷用戶傳入的數據是否爲數字類型且長度適中,最大僅支持到兆位,小數點後兩位
    :return: 數據無誤則返回True,否則False
    """
    if not isinstance(self.check_num, (int, float)):
        return False
    elif isinstance(self.check_num, int) and len(self.num) > 13:
        return False
    elif isinstance(self.check_num, float):
        int_part, dec_part = str(self.check_num).split('.')
        if len(int_part) > 13 or len(dec_part) > 2:
            return False
    return True
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章