將數字轉換爲人民幣大寫

將數字轉換爲人民幣大寫。 python

例如: 12058304.368元,轉換爲:壹仟貳佰零伍萬捌仟叄佰零肆元叄角陸分 app

注:13位數字的金額已經不小了,萬億 spa

def num2chn(num):
    """
    將數字(數字字符串)轉換爲人民幣大寫
    :param num: int、float或者str
    :return: 返回處理結果,發生錯誤返回None
    """
    chr = ('零', '壹', '貳', '叄', '肆', '伍', '陸', '柒', '捌', '玖')
    bit = ('分', '角', '元', '拾', '佰', '仟', '萬', '拾', '佰', '仟', '億', '拾', '佰', '仟', '萬')
    # 例 324562.003
    # 轉換爲 00265423
    try:
        num = float(num)
        # 將數字反序排列,從右至左依次
        num_str = ('%0.2f' % num).replace('.', '')[::-1]
    except ValueError:
        return None
    n = len(num_str)
    if n >= 15:
        return None
    result = []
    for i in range(0, n):
        # 非圓、萬、億,
        if num_str[i] == "0" and i != 2 and i != 6 and i != 10:
            s = chr[0]
        elif num_str[i] == "0" and (i == 2 or i == 6 or i == 10):
            s = bit[i]
        else:
            s = bit[i] + chr[int(num_str[i])]
        result.append(s)
    # 從左值右重排字符串
    rst = "".join(result)[::-1]
    # 去零,中間多個零合併爲一個,尾部零全去, "零" == chr[0]
    # r = r"[零]+"
    r = "[" + chr[0] + "]+"
    rst = re.compile(r).sub(chr[0], rst).rstrip(chr[0])
    # 去零元、零萬、零億
    for i in [2, 6, 10]:
        rst = rst.replace(chr[0]+bit[i], bit[i])
    if rst[-1] == bit[2]:
        rst += "整"
    print('%0.2f' % num)
    print(rst)
    return rst
相關文章
相關標籤/搜索