python 實現金額數字轉成大寫


原文:https://www.cnblogs.com/kearney908/p/7085999.html

改造:把處理0的注釋掉,避免出現【0角一分】等情況

def cncurrency(value, capital=True, prefix=False, classical=None):
    '''
    參數:
    capital:    True   大寫漢字金額
                False  一般漢字金額
    classical:  True   元
                False  圓
    prefix:     True   以'人民幣'開頭
                False, 無開頭
    '''
    if not isinstance(value, (Decimal, str, int)):
        msg = '''
        由於浮點數精度問題,請考慮使用字符串,或者 decimal.Decimal 類。
        因使用浮點數造成誤差而帶來的可能風險和損失作者概不負責。
        '''
        warnings.warn(msg, UserWarning)
    # 默認大寫金額用圓,一般漢字金額用元
    if classical is None:
        classical = True if capital else False

    # 漢字金額前綴
    if prefix is True:
        prefix = '人民幣'
    else:
        prefix = ''

    # 漢字金額字符定義
    dunit = ('', '')
    if capital:
        num = ('', '', '', '', '', '', '', '', '', '')
        iunit = [None, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
    else:
        num = ('', '', '', '', '', '', '', '', '', '')
        iunit = [None, '', '', '', '', '', '', '', '', '', '', '', '', '', '', '']
    if classical:
        iunit[0] = '' if classical else ''
    # 轉換為Decimal,並截斷多余小數

    if not isinstance(value, Decimal):
        value = Decimal(value).quantize(Decimal('0.01'))

    # 處理負數
    if value < 0:
        prefix += ''  # 輸出前綴,加負
        value = - value  # 取正數部分,無須過多考慮正負數舍入
        # assert - value + value == 0
    # 轉化為字符串
    s = str(value)
    if len(s) > 19:
        raise ValueError('金額太大了,不知道該怎么表達。')
    istr, dstr = s.split('.')  # 小數部分和整數部分分別處理
    istr = istr[::-1]  # 翻轉整數部分字符串
    so = []  # 用於記錄轉換結果

    #
    if value == 0:
        return prefix + num[0] + iunit[0]
    haszero = False  # 用於標記零的使用
    if dstr == '00':
        haszero = True  # 如果無小數部分,則標記加過零,避免出現“圓零整”

    # 處理小數部分
    #
    if dstr[1] != '0':
        so.append(dunit[1])
        so.append(num[int(dstr[1])])
    else:
        so.append('')  # 無分,則加“整”
    #
    if dstr[0] != '0':
        so.append(dunit[0])
        so.append(num[int(dstr[0])])
    elif dstr[1] != '0':
        # so.append(num[0])  # 無角有分,添加“零”
        # haszero = True  # 標記加過零了
        pass

    # 無整數部分
    if istr == '0':
        if haszero:  # 既然無整數部分,那么去掉角位置上的零
            so.pop()
        so.append(prefix)  # 加前綴
        so.reverse()  # 翻轉
        return ''.join(so)

    # 處理整數部分
    for i, n in enumerate(istr):
        n = int(n)
        if i % 4 == 0:  # 在圓、萬、億等位上,即使是零,也必須有單位
            if i == 8 and so[-1] == iunit[4]:  # 億和萬之間全部為零的情況
                so.pop()  # 去掉萬
            so.append(iunit[i])
            if n == 0:  # 處理這些位上為零的情況
                # if not haszero:  # 如果以前沒有加過零
                    # so.insert(-1, num[0])  # 則在單位后面加零
                    # haszero = True  # 標記加過零了
                pass
            else:  # 處理不為零的情況
                so.append(num[n])
                haszero = False  # 重新開始標記加零的情況
        else:  # 在其他位置上
            if n != 0:  # 不為零的情況
                so.append(iunit[i])
                so.append(num[n])
                haszero = False  # 重新開始標記加零的情況
            else:  # 處理為零的情況
                if not haszero:  # 如果以前沒有加過零
                    # so.append(num[0])
                    # haszero = True
                    pass

    # 最終結果
    so.append(prefix)
    so.reverse()
    return ''.join(so)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM