中文数字转换工具
下面我将介绍一个功能强大的中文数字转换工具,支持在阿拉伯数字和中文大写/小写数字之间进行双向转换。这个工具基于Python的Tkinter库开发,具有直观的用户界面。
功能概述
该工具提供两大核心功能:
数字转中文:将阿拉伯数字转换为中文大写或小写表示
中文转数字:将中文大写或小写数字转换回阿拉伯数字
核心算法实现
1. 数字转中文算法
def digital_to_chinese(numbers: str, is_large: bool = False) -> str:
"""
将数字转换为中文大写或小写表示
:param numbers: 需要转换的数字
:param is_large: 是否转换为大写,默认为 False 表示小写
:return: 转换后的中文表示
"""
# 验证输入是否为有效数字
s = (numbers.replace("0", "").replace("1", "").replace("2", "")
.replace("3", "").replace("4", "").replace("5", "")
.replace("6", "").replace("7", "").replace("8", "")
.replace("9", "").replace(".", ""))
if len(s) != 0:
return "数字格式不正确"
# 分割整数和小数部分
number_list = numbers.replace("\n", "").split(".")
if len(number_list) == 2:
number = number_list[0]
decimals = number_list[1]
elif len(number_list) == 1:
number = number_list[0]
decimals = None
else:
return "数字格式不正确"
# 移除前导零
while number.startswith("0") and len(number) > 1:
number = number[1:]
# 定义数字映射
large_key = {
"0": "零", "1": "壹", "2": "贰", "3": "叁", "4": "肆",
"5": "伍", "6": "陆", "7": "柒", "8": "捌", "9": "玖"
}
small_key = {
"0": "零", "1": "一", "2": "二", "3": "三", "4": "四",
"5": "五", "6": "六", "7": "七", "8": "八", "9": "九"
}
# 定义单位
large_basics_unit = ["", "拾", "佰", "仟"]
small_basics_unit = ["", "十", "百", "千"]
unit = ["万", "亿", "兆", "京", "垓", "秭", "穰", "沟", "涧", "正", "载", "极",
"恒河沙", "阿僧祇", "那由他", "不可思议", "无量大数"]
# 根据大写/小写选择映射
key = large_key if is_large else small_key
basics_unit = large_basics_unit if is_large else small_basics_unit
# 处理整数部分
if number == "0":
result = "零"
else:
# 将数字按每四位分组
split_data = string_split(number, 4, True)[::-1]
# 处理第一组
new_data = string_split(split_data[0], 1)[::-1]
result = ""
for j in range(len(new_data)):
if new_data[j] == "0":
result = "0" + result
else:
result = f"{new_data[j]}{basics_unit[j]}" + result
# 处理剩余组
unit_start = 0
for i in split_data[1:]:
if i != "0000":
result_ = ""
new_data = string_split(i, 1)[::-1]
for j in range(len(new_data)):
if new_data[j] == "0":
result_ = "0" + result_
else:
result_ = f"{new_data[j]}{basics_unit[j]}" + result_
# 清理尾部的零
while result_.endswith("0"):
result_ = result_[:-1]
result_ += unit[unit_start]
result = result_ + result
unit_start += 1
# 替换数字为中文
for k, v in key.items():
result = result.replace(k, v)
# 清理多余的零单位
zero_unit = ["零" + u for u in basics_unit + unit]
for _ in range(len(result)):
if any(result.endswith(zu) for zu in zero_unit):
result = result[:-len(zero_unit[0])]
else:
break
# 处理小数部分
if decimals:
result += "点"
for i in decimals:
result += key[i]
return result2. 中文转数字算法
def chinese_to_digital(chinese: str, is_large: bool = False) -> int:
"""
将中文数字(大写或小写)转换为阿拉伯数字
:param chinese: 需要转换的中文数字
:param is_large: 转换源是为大写,默认为 False 表示小写
:return: 转换后的阿拉伯数字
"""
# 定义数字映射
large_key = {
"零": 0, "壹": 1, "贰": 2, "叁": 3, "肆": 4,
"伍": 5, "陆": 6, "柒": 7, "捌": 8, "玖": 9
}
small_key = {
"零": 0, "一": 1, "二": 2, "三": 3, "四": 4,
"五": 5, "六": 6, "七": 7, "八": 8, "九": 9
}
# 定义单位
large_basics_unit = {"仟": 1000, "佰": 100, "拾": 10}
small_basics_unit = {"千": 1000, "百": 100, "十": 10}
unit = {
"无量大数": 10**68, "不可思议": 10**64, "那由他": 10**60,
"阿僧祇": 10**56, "恒河沙": 10**52, "极": 10**48,
"载": 10**44, "正": 10**40, "涧": 10**36,
"沟": 10**32, "穰": 10**28, "秭": 10**24,
"垓": 10**20, "京": 10**16, "兆": 10**12,
"亿": 10**8, "万": 10000
}
# 根据大写/小写选择映射
key = large_key if is_large else small_key
basics_unit = large_basics_unit if is_large else small_basics_unit
# 处理小数部分
behind_number = ""
if "点" in chinese:
before, behind = chinese.split("点", 1)
behind_number = "".join(str(key[i]) for i in behind)
chinese = before
# 处理大单位
result_list = []
for unit_key, unit_value in unit.items():
if unit_key in chinese:
parts = chinese.split(unit_key, 1)
if parts[0]:
# 处理单位前的数字
number_part = parts[0]
while number_part.startswith("零"):
number_part = number_part[1:]
result_list.append(unit_value * small_number_fn(number_part, basics_unit, key))
chinese = parts[1] if len(parts) > 1 else ""
# 处理剩余部分
if chinese:
result_list.append(small_number_fn(chinese, basics_unit, key))
# 组合结果
total = sum(result_list)
if behind_number:
return f"{total}.{behind_number}"
return str(total)用户界面实现
class NumberConverterApp:
def __init__(self, root):
self.root = root
self.root.title("中文数字转换器")
self.root.geometry("500x400")
self.root.resizable(False, False)
self.create_widgets()
def create_widgets(self):
# 输入框区域
input_frame = ttk.LabelFrame(self.root, text="输入")
input_frame.pack(padx=10, pady=5, fill="x")
self.input_text = tk.Text(input_frame, height=5, font=("Microsoft YaHei", 10))
self.input_text.pack(padx=5, pady=5, fill="x")
# 控制区域
control_frame = ttk.Frame(self.root)
control_frame.pack(padx=10, pady=5, fill="x")
# 转换方向选择
ttk.Label(control_frame, text="转换方向:").grid(row=0, column=0, padx=5)
self.conversion_type = tk.StringVar(value="to_chinese")
ttk.Radiobutton(control_frame, text="数字转中文",
variable=self.conversion_type, value="to_chinese").grid(row=0, column=1, padx=5)
ttk.Radiobutton(control_frame, text="中文转数字",
variable=self.conversion_type, value="to_digital").grid(row=0, column=2, padx=5)
# 大写选项
self.use_large = tk.BooleanVar()
ttk.Checkbutton(control_frame, text="使用大写",
variable=self.use_large).grid(row=0, column=3, padx=5)
# 转换按钮
ttk.Button(control_frame, text="转换", command=self.convert).grid(row=0, column=4, padx=5)
# 输出框区域
output_frame = ttk.LabelFrame(self.root, text="输出")
output_frame.pack(padx=10, pady=5, fill="both", expand=True)
self.output_text = tk.Text(output_frame, height=10, font=("Microsoft YaHei", 10), state="disabled")
self.output_text.pack(padx=5, pady=5, fill="both", expand=True)
# 状态栏
self.status_var = tk.StringVar(value="就绪")
ttk.Label(self.root, textvariable=self.status_var, relief="sunken", anchor="w").pack(side="bottom", fill="x")
def convert(self):
# 获取输入内容
input_data = self.input_text.get("1.0", "end-1c").strip()
if not input_data:
messagebox.showwarning("输入为空", "请输入要转换的内容")
return
# 清除输出框
self.output_text.config(state="normal")
self.output_text.delete("1.0", "end")
# 根据选择进行转换
try:
if self.conversion_type.get() == "to_chinese":
result = digital_to_chinese(input_data, self.use_large.get())
self.output_text.insert("1.0", result)
self.status_var.set(f"转换完成: 数字 -> 中文{'大写' if self.use_large.get() else '小写'}")
else:
result = chinese_to_digital(input_data, self.use_large.get())
self.output_text.insert("1.0", f"{result}")
self.status_var.set(f"转换完成: 中文 -> 数字")
except Exception as e:
self.output_text.insert("1.0", f"转换错误: {str(e)}")
self.status_var.set(f"错误: {str(e)}")
self.output_text.config(state="disabled")使用示例
示例1:数字转中文
在输入框中输入阿拉伯数字:
123456789.12选择"数字转中文"选项
勾选"使用大写"(可选)
点击"转换"按钮
输出框显示结果:
壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖点壹贰
示例2:中文转数字
在输入框中输入中文数字:
五亿三千万选择"中文转数字"选项
点击"转换"按钮
输出框显示结果:
530000000
技术特点
支持超大数字:最高可处理到"无量大数"(10^68)级别的数字
小数支持:完美处理带小数点的数字转换
灵活的单位处理:
支持中文数字的各种单位(万、亿、兆等)
正确处理单位间的组合关系
错误处理:
验证输入格式
捕获并显示转换过程中的异常
用户友好界面:
清晰的输入/输出区域
状态栏显示操作结果
支持复制粘贴操作
界面效果
+--------------------------------------------+
| 中文数字转换器 |
+--------------------------------------------+
| [输入] |
| +----------------------------------------+ |
| | | |
| | | |
| | | |
| +----------------------------------------+ |
| |
| [转换方向:] ○数字转中文 ○中文转数字 [使用大写] [转换] |
| |
| [输出] |
| +----------------------------------------+ |
| | | |
| | | |
| | | |
| +----------------------------------------+ |
| |
| [状态栏:就绪] |
+--------------------------------------------+应用场景
财务系统:生成发票、合同中的大写金额
教育领域:数学教学中数字的中文表示
金融领域:处理大额数字的表示和转换
文档处理:自动将数字转换为正式的中文表示
总结
这个中文数字转换工具通过精心设计的算法实现了:
双向转换:支持数字到中文和中文到数字的双向转换
大小写支持:可选择使用大写或小写中文数字
高精度处理:支持超大数字和精确的小数转换
用户友好:直观的界面设计和即时的反馈机制
在工作中这个工具都能提供准确、高效的数字转换服务。
下载
文件名批量修改V1.1.0.0:
描述:
可以将阿拉伯数字和中文数字(大小写)进行转换。
下载:
- 感谢你赐予我前进的力量
赞赏者名单
因为你们的支持让我意识到写文章的价值🙏
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果

