Python 阿拉伯数字转换为中文大写数字

题目

python练习的一个小实验,  题目如下图:

附阿拉伯数字对应的中文大写:

思路

1. 通过定义一个字典进行阿拉伯数字与大写中文的对比储存
2. 将用户的输入首先分割为整数与小数部分分别进行处理
3. 整数部分可以分割为以 4 位数字为一组的列表来进行转换处理,这样便于进行
(兆,亿,万,圆)。的单位处理
4. 首先将分割的 4 位数字一组的数据进行转化处理,便于对 (拾,佰,仟)的单
位进行处理(此部分应编写到一个函数之中,接受的参数为 4 位数的字符串,
返回转化好的字符串)
5. 整数部分可以看做多个 4 位数字一组的数据处理,通过遍历列表进行转化处理
(例如你已将 123456789 分割好为[‘1’,’2345’,’6789’],循环遍历这个列表, 用第
四点提到的函数进行转化,遍历转化时把【兆,亿,万,圆】的单位标识添加)
6. 通过这种方式进行转化你需要定义两个列表分别储存(兆,亿,万,圆)和
(拾,佰,仟)这些单位标识
7. 小数部分的处理通过分支判断情况进行转化即可。

代码

思路清晰了, 代码直接码上即可, 注意处理特殊条件和边界:

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : num_to_chinese.py
# @Author: meta
# @Contact : [email protected]
# @Date  : 20-3-28下午9:48
# @Desc  : 阿拉伯数字代表的金额, 转换为大写数字


limit_len1 = 16  # 不超过一万兆
limit_len2 = 2  # 小数位不超过两位

dictionary = {
    '0': '零',
    '1': '壹',
    '2': '贰',
    '3': '叁',
    '4': '肆',
    '5': '伍',
    '6': '陆',
    '7': '柒',
    '8': '捌',
    '9': '玖'
}

level1 = {
    1: '圆',
    2: '万',
    3: '亿',
    4: '兆'
}

level2 = {
    2: '拾',
    3: '佰',
    4: '仟'
}

level3 = {
    1: '角',
    2: '分'
}


def query():
    while 1:
        ans = str(input('请输入不超过一万兆的金额, 小数位不超过两位: '))
        if len(ans.split('.')[0]) <= limit_len1 \
                and len(ans.split('.')[1]) <= limit_len2:
            return ans


def process_integer(num_integer):
    pre = []
    length = len(num_integer)
    if length <= 4:
        pre.append(num_integer)
    else:
        extra = length % 4
        if extra != 0:
            pre.append(num_integer[0: extra])
            length = length - extra
            start, end = extra, 4 + extra
        else:
            start, end = 0, 4
        while length:
            pre.append(num_integer[start: end])
            start += 4
            end += 4
            length -= 4
    return pre


def per_conver(num):
    length = len(num)
    flag = True

    # Special
    # deal with '0000'
    if num == '0000':
        return ''
    # deal with '1000'
    if num[1:] == '000':
        return dictionary[num[0]] + level2[4]

    # Normal
    res, p = '', length
    for i in range(0, length):
        # deal with prefix is '0'
        if (res == '' or res == dictionary[num[i]]) and num[i] == '0':
            # only one '0'
            if flag:
                res += dictionary[num[i]]
                flag = False
            p -= 1
            continue
        # deal with '1001'
        if i + 1 < length and num[i + 1] == '0' and num[i] == '0':
            p -= 1
            continue
        # deal with '1010' '1110'
        if i == length - 1 and num[i] == '0':
            continue
        res += dictionary[num[i]]
        if p > 1 and num[i] != '0':
            res += level2[p]
        p -= 1
    return res


def convert_integer(ans_int):
    res = ''
    p = len(ans_int)
    for i in ans_int:
        per_res = per_conver(i)
        res += per_res
        if p > 0 and per_res != '':
            res += level1[p]
        p -= 1
    return res


def convert_float(num_float):
    res = ''
    for i in range(0, len(num_float)):
        res += dictionary[num_float[i]]
        if (i + 1) <= 2:
            res += level3[i + 1]
    return res


def convert():
    number = query()
    res = ''
    if '.' in number:
        num_split = number.split('.')
        num_integer = num_split[0]
        num_float = num_split[1]
        ans_int = process_integer(num_integer)
        print(ans_int)
        # Convert integer
        res += convert_integer(ans_int)
        # Convert float
        res += convert_float(num_float)
    else:
        ans_int = process_integer(number)
        res += convert_integer(ans_int)
    res += '整'
    print(res)


if __name__ == '__main__':
    convert()

为了校验正确性, 附上数字金额转中文大写金额的在线工具:  https://szjrzzwdxje.51240.com/

猜你喜欢

转载自blog.csdn.net/angry_program/article/details/105171545