将数字金额转换为对应的中文大写金额

一个小问题,将指定的数字金额转换输出为对应的中文大写金额,比如:对于数字金额123,输出:壹佰贰拾叁圆

讨论之前,我们约定,数字最大不超过9999999999999.99,且最多只有两位小数。

问题不难,主要需考虑以下几点:

  • 阿拉伯数字转换为对应的中文大写,比如,对于阿拉伯数字1,对应输出

  • 每个位置的数字后紧跟正确的单位,比如对于从右向左的第三位(不包含小数点),如果当前数字不为零,则需体现出的概念

  • 连续的数字0不能输出多个,这是不符合日常习惯的

对于前两点,我们可以使用Python中的dict类型来实现关系的转换,比如,数字转换字典定义如下:

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

单位字典定义如下,字典中的key是数字中单位的坐标索引:

d_d = {0: '分', 1: '角', 2: '圆', 3: '拾', 4: '佰', 5: '仟', 6: '万', 7: '拾', 8: '佰', 9: '仟', 10: '亿', 11: '拾', 12: '佰',
           13: '仟',
           14: '万'}

对于第三点,我们需要定义一个临时变量,记录前一个位置的数字是否为零,这样,我们就可以同时结合当前位置的数字来决定是否输出

完整代码如下:

def to_currency(number):
    if not isinstance(number, float) and not isinstance(number, int):
        return 'non number'
    if number < 0 or number > 9999999999999.99:
        return 'wrong number'
    if number == 0:
        return '零圆'
    c_d = {'0': '零', '1': '壹', '2': '贰', '3': '叁', '4': '肆', '5': '伍', '6': '陆', '7': '柒', '8': '捌', '9': '玖'}
    d_d = {0: '分', 1: '角', 2: '圆', 3: '拾', 4: '佰', 5: '仟', 6: '万', 7: '拾', 8: '佰', 9: '仟', 10: '亿', 11: '拾', 12: '佰',
           13: '仟',
           14: '万'}
    L = []
    pre = '0'
    s = str(int(number * 100))[::-1].replace('.', '')
    index = -1

    for c in s:
        index += 1
        if c == '0' and pre == '0':
            if index == 2:
                L.insert(0, '圆')
        elif c == '0':
            if index == 2:
                L.insert(0, '圆')
            else:
                L.insert(0, '零')
            pre = c
        else:
            L.insert(0, c_d[c] + "" + d_d[index])
            pre = c
    return ''.join(L)

测试代码如下:

if __name__ == '__main__':
    print(to_currency(123))
    print(to_currency(14001))
    print(to_currency(9999999999999))
    print(to_currency(92830))
    print(to_currency(92800))
    print(to_currency(92800.89))
    print(to_currency(92800.09))
    print(to_currency(92800.98))
    print(to_currency(92800.08))
    print(to_currency(92800.90))
    print(to_currency(900008.90))
    print(to_currency(0.90))
    print(to_currency(1.90))
    print(to_currency(192.33))
    print(to_currency(0))
    print(to_currency(1))
    print(to_currency(10))
    print(to_currency(100))
    print(to_currency(1000))

输出结果:

壹佰贰拾叁圆
壹万肆仟零壹圆
玖万玖仟玖佰玖拾玖亿玖仟玖佰玖拾玖万玖仟玖佰玖拾玖圆
玖万贰仟捌佰叁拾圆
玖万贰仟捌佰圆
玖万贰仟捌佰圆捌角玖分
玖万贰仟捌佰圆零玖分
玖万贰仟捌佰圆玖角捌分
玖万贰仟捌佰圆零捌分
玖万贰仟捌佰圆玖角
玖拾零捌圆玖角
玖角
壹圆玖角
壹佰玖拾贰圆叁角叁分
零圆
壹圆
壹拾圆
壹佰圆
壹仟圆

PS:测试案例只是部分,可能测试不充分,欢迎讨论!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值