Python 數字轉財務大寫數字(二)

今天把功能補全了,可以實現完全的轉換功能,包括小數部分。
主要就是增加了用float函數判斷輸入是否合法,用preTreatment函數將數字分爲整數和小數部分,然後用convert函數來對兩部分分別進行處理。

import re
digits = list('0123456789')
accDigits = list('零壹貳叄肆伍陸柒捌玖')
units = ['', '拾', '佰', '仟']
sep = list('分角元萬億兆')
acc_conv_dict = dict(zip(digits, accDigits))


def preTreatment(num):
    num = '{:.2f}'.format(float(num))
    partition = num.partition('.')
    iPart, fPart = partition[0], partition[2]
    return iPart, fPart


def convert(num):
    iPart, fPart = preTreatment(num)
    blocks = four_digits_block(iPart)
    iPartStr, fPartStr = '', ''
    for blockIndex in range(len(blocks)):
        block = blocks[blockIndex]
        for index in range(4):
            if not (blockIndex == 0 and index == 2 and block[index] == '1'):
                iPartStr += acc_conv_dict[block[index]]
            if block[index] != '0':
                iPartStr += units[3 - index]
        iPartStr = iPartStr.strip('零')
        iPartStr += sep[len(blocks) - blockIndex + 1]

    iPartStr = re.sub('零+', '零', iPartStr)

    for index in range(len(fPart)):
        fPartStr += acc_conv_dict[fPart[index]]
        if fPart[index] != '0':
            fPartStr += sep[1 - index]
    fPartStr = fPartStr.strip('零')

    if fPartStr == '':
        result = iPartStr + '整'
    else:
        result = iPartStr + fPartStr

    return result


def four_digits_block(iPart):
    fill_counter = 4 - (len(iPart) % 4) if len(iPart) % 4 != 0 else 0
    zero_fill = iPart.zfill(fill_counter + len(iPart))
    blocks = [zero_fill[i * 4:(i + 1) * 4] for i in range(len(zero_fill) // 4)]
    return blocks


while True:
    num = input("請輸入數字:")
    if num == '':
        print('歡迎您再次使用,再見!')
        break
    try:
        float(num)
    except:
        print('輸入數字不合法!')
        pass

    result = convert(num)
    print(result)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章