Python实现阿拉伯数字转中文数字

实现功能:

输入阿拉伯数字,输出为中文数字

如:

Number:666666
六十六万六千六百六十六

理论可以实现无限高位数的转化

前提是代码中的 unitList 足够长!!!

完整代码:

# -*- coding: UTF-8 -*-
# 汉字数字大全 https://baike.baidu.com/item/%E4%B8%AD%E6%96%87%E6%95%B0%E5%AD%97/2921705
numList = "零一二三四五六七八九"
digitList = ["", "十", "百", "千", "万"]
unitList = ["", "亿", "兆", "京", "垓", "秭", "穣", "沟", "涧", "正", "载", "极", "恒河沙", "阿僧祇", "那由他", "不可思议", "无量大数"]
# unitList = ["", "亿", "兆", "京", "垓", "秭", "穣", "沟", "涧", "正", "载", "极", "恒河沙", "阿僧祇", "那由他", "不可思议", "无量大数",
#             "大数", "天", "空", "散", "虚", "寂", "竭", "莫", "宁", "静", "窈", "冥", "忘", "无", "杳", "溟", "涬", "溟涬", "杳冥",
#             "杳溟", "杳涬", "溟涬杳", "溟涬杳冥", "溟涬杳溟", "杳冥无际", "溟涬无垠", "杳冥无垠", "杳溟无垠", "溟涬杳冥无垠",
#             "杳冥溟涬无垠", "杳溟溟涬无垠", "杳冥溟涬杳无垠", "杳溟溟涬杳冥无垠", "杳冥杳溟溟涬杳冥无垠", "无尽", "无穷", "无界",
#             "无疆", "无垠", "无央", "无极", "无量", "无法", "无边", "无等", "无等等"]
# 文心一言3.5回答(太长了)


def No2zh4pin(number):  # 不能超过百万(不含百万)
    number = [int(s) for s in str(number)]
    numberLen = len(number)
    chinese = ""
    if numberLen == 1 and number[0] == 0:  # 如果是0
        chinese += numList[0]
    elif numberLen == 2 and number[0] == 1:  # 如果是十几
        chinese += digitList[1]
        if number[1]:  # 如果不是整十
            chinese += numList[number[1]]
    else:  # 非特殊情况
        for num in enumerate(number[::-1]):
            if not num[1] and len(chinese) > 0 and chinese[-1] != numList[0]:  # 多个0只读一个,低位无数字不读
                chinese += numList[0]
            elif num[1]:  # 不是零,正常读
                chinese += digitList[num[0]] + numList[num[1]]
        chinese = chinese[::-1]  # 反转,得到正常字符串
    return chinese


def No2zh8pin(number):  # 不能超过兆(不含兆)
    chinese = ""
    num0 = int(number // 10000)  # 获取高四位
    num1 = number % 10000  # 获取低四位
    if num0:  # 如果高位非零
        chinese += No2zh4pin(num0) + digitList[4]
        if num1 and num1 < 1000:  # 如果要添加零
            chinese += numList[0]
    if num1 or not num0:  # 如果低位非零或高位是零
        chinese += No2zh4pin(num1)
    return chinese


def No2zh(number):
    number = str(number)[::-1]  # 转化为字符串
    number = [int(number[i:i + 8][::-1]) for i in range(0, len(number), 8)]  # 按八位分割
    chinese = []
    for num in enumerate(number):  # 循环八位数字
        if not num[1] and num[0] + 1 != len(number):  # 如果这八位是零
            continue
        chinese.append(No2zh8pin(num[1]) + unitList[num[0]])  # 添加位称
        if num[0] - 1 >= 0 and number[num[0] - 1] and number[num[0] - 1] < 1000000:  # 如果要添加零
            chinese[-1] += numList[0]
    return "".join(chinese[::-1])  # 反转,得到正常字符串


if __name__ == "__main__":
    while 1:  # 循环输入
        print(No2zh(int(input("Number:"))))

结果:

Number:666666
六十六万六千六百六十六
Number:123456789
一亿二千三百四十五万六千七百八十九
Number:500424460
五亿零四十二万四千四百六十
Number:145423450001234323411111166666600000000001000001456545677763222656789
一万四千五百四十二涧三千四百五十万零十二沟三千四百三十二万三千四百一十一穣一千一百一十一万六千六百六十六秭六千六百万垓零一千京零十四万五千六百五十四兆五千六百七十七万七千六百三十二亿二千二百六十五万六千七百八十九

  • 8
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值