目录
问题及思路
问题
这是代码中主要问题,大家可以尝试自己解决,并用代码实现
思路
将数字以每四个字符划分一个数级,防止万和亿这两个数级单位重复输出。下面\数字\为一个数级
小写中文数字 = 小写中文数字 + 计数单位 + 数级
1.小写中文数字
- 不是0输出小写中文
- 数级上后面为0,不输出零:例如\150\2000\➤一百五十(零)万两千(零零零)
- 数级开头或中间为0,结尾不为0,只输出一个零:例如\15\0002\➤十五万零(零零)二
2.计数单位
- 计数单位上的数字为0则不输出:例如\15\0200\➤十五万零(千)二百
3.数级
- 数级上都为0不输出:例如\15\0000\2000\➤十二亿零(万)两千,万级4位都为0,不输出万
4.特殊
- 开头是一十开头,一省去:例如\15\2000\➤(一)十五万两千
- 中间后面的一十不省去:例如\15\0010\➤十五万零一十一
代码
导图
代码
# 定义
# number是要转化的数字,为字符串
number = input("请输入数字")
# Chinese是要输出的数字,为字符串
Chinese = ""
# Num是中文小写数字,0为空,自定义控制0的输出
Num = ("", "一", "二", "三", "四", "五", "六", "七", "八", "九")
# NumUnit是计数单位,个位不读,为空
NumUnit = ("", "十", "百", "千")
# Unit是数级,个不读
Unit = ("", "万", "亿")
# bit是位数,表示该数字是第几位数
bit = len(number)
# key判断当前数级是否有数据(四位是否都为0)
key = False
# 数据
# 从头开始遍历字符串number每一个数字
# numChart为数字字符串中单独一个数字字符
for numChart in number:
# 如果当前数字不是0
if numChart != '0':
# 中文小写数字 + 计数单位
# Num[int(numChart)] 将数字转为int类型作为索引转换成中文小写数字
# NumUnit[(bit - 1) % 4] 将位数作为索引取计数单位
# 因为元组索引是从0开始,而最小的计数单位为1位小数,所以bit - 1
Chinese += Num[int(numChart)] + NumUnit[(bit - 1) % 4]
# 数字不是0,表示该数级有数据
if not key:
key = True
# 如果数字是0
else:
# 多个0遍历到最后一个0,对最后一个0进行判断选择零的输出
# bit % 4 != 1 确保该0不是数级中最后一位,最后一位0不读,同时防止字符串numberi索引越界
# number[len(number) - bit + 1] != '0' 下一位数字不为0,确保了多个0遍历到最后一个0
if (bit % 4 != 1) and (number[len(number) - bit + 1] != '0'):
Chinese += "零"
# 数级
# 数字是数级中最后一位,且数级有数据(四位不全为0),输出数级
if (bit % 4 == 1) and key:
# Unit[bit // 4] 用当前数字在第几个数级为索引取数级
# 因为数字每四位为一个数级,位数除4取整即为第几个数级,所以bit // 4
Chinese += Unit[bit // 4]
# key为false,对下一个数级是否有无数据进行判断
key = False
# 位数从高位到低位
bit -= 1
# 输出
# 如果没有数据,长度为0,即为零
if len(Chinese) == 0:
Chinese = "零"
# 如果字符串以一十开头,截取一
if (len(number) % 4 == 2) and (Chinese[0] == "一"):
Chinese = Chinese[1:len(Chinese):1]
# 输出
print(Chinese)