Python实现中文数字与阿拉伯数字映射生成器(支持0-9999)
文章目录
- 1. 引言
- 2. 需求分析
- 3. 核心实现思路
- 4. 完整代码实现
1. 引言
在中文文本处理和自然语言处理(NLP)应用中,经常需要将中文数字转换为阿拉伯数字。本文将介绍如何使用Python根据用户从控制台输入的数字范围,生成相应的中文数字到阿拉伯数字的映射字典,并将结果保存为JSON文件。
2. 需求分析
开发一个Python程序,根据用户输入的数字(最大9999),自动生成中文数字与阿拉伯数字的映射字典,并保存为JSON文件。例如:输入10时,生成{“零”:0, “一”:1,…, “十”:10}。
3. 核心实现思路
1. 中文数字转换规则
- 单位系统:万(超过9999的部分)、千、百、十、个位。
- 零处理:连续零仅保留一个(如205→“二百零五”),末尾零省略(如100→“一百”)。
- 特殊读法:10读作“十”而非“一十”。
2. 用户输入验证
- 确保输入为整数、且在0~9999之间。
3. JSON文件生成
- 使用Python标准库json保存字典,保留Unicode字符。
4. 完整代码实现
import jsondef number_to_chinese(num):"""将0-9999的整数转换为中文数字"""units = ['', '十', '百', '千']digits = {0: '零', 1: '一', 2: '二', 3: '三', 4: '四',5: '五', 6: '六', 7: '七', 8: '八', 9: '九'}if num == 0:return digits[0]num_str = str(num)length = len(num_str)result = []has_zero = False # 标记前一位是否是零for i, n in enumerate(num_str):n = int(n)pos = length - i - 1 # 当前位数(0=个位,1=十位...)if n == 0:if not has_zero and pos != 0:result.append(digits[0])has_zero = Trueelse:if has_zero:result.pop() # 删除前导零has_zero = Falseresult.append(digits[n])if pos > 0:result.append(units[pos])# 处理10-19的特殊情况(如10→十,11→十一)if 10 <= num <= 19 and length == 2:result = result[1:] if num == 10 else ['十' + digits[int(num_str[1])]]return ''.join(result).replace('零千', '零').rstrip('零')def validate_input(prompt):"""验证用户输入是否为0-9999的整数"""while True:user_input = input(prompt)try:num = int(user_input)if 0 <= num <= 9999:return numprint("错误:请输入0到9999之间的整数!")except ValueError:print("错误:输入必须为整数!")def generate_mapping(max_num):"""生成中文数字映射字典"""return {number_to_chinese(i): i for i in range(max_num + 1)}def main():max_num = validate_input("请输入最大阿拉伯数字(0-9999): ")mapping = generate_mapping(max_num)# 保存为JSON文件filename = f"chinese_numbers_{max_num}.json"with open(filename, 'w', encoding='utf-8') as f:json.dump(mapping, f, ensure_ascii=False, indent=2)print(f"生成成功!映射文件已保存为 {filename}")# 读取JSON文件with open(filename, 'r', encoding='utf-8') as f:loaded_dict = json.load(f)print("成功读取字典:", loaded_dict)if __name__ == "__main__":main()
关键代码解析
1. 数字转换函数
- 动态单位拼接:根据数字位置添加“千、百、十”等单位。
- 零处理优化:通过has_zero标志避免重复零,如2001→“二千零一”。
- 边界特判:单独处理10-19的读法,确保符合中文习惯。
2. 输入验证
- 使用循环强制用户输入合法数值,防止程序崩溃。
3. 文件输出
- ensure_ascii=False确保JSON文件直接显示中文而非Unicode转义。
运行示例
1. 输入验证
请输入最大阿拉伯数字(0-9999): abc
错误:输入必须为整数!
请输入最大阿拉伯数字(0-9999): 10000
错误:请输入0到9999之间的整数!
2. 生成结果,输入10时,输出文件内容:
{"零": 0,"一": 1,"二": 2,"三": 3,"四": 4,"五": 5,"六": 6,"七": 7,"八": 8,"九": 9,"十": 10
}
输入9999运行结果: