下面我将介绍一个功能强大的中文数字转换工具,支持在阿拉伯数字和中文大写/小写数字之间进行双向转换。这个工具基于Python的Tkinter库开发,具有直观的用户界面。

功能概述

该工具提供两大核心功能:

  1. 数字转中文:将阿拉伯数字转换为中文大写或小写表示

  2. 中文转数字:将中文大写或小写数字转换回阿拉伯数字

核心算法实现

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 result

2. 中文转数字算法

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:数字转中文

  1. 在输入框中输入阿拉伯数字:123456789.12

  2. 选择"数字转中文"选项

  3. 勾选"使用大写"(可选)

  4. 点击"转换"按钮

  5. 输出框显示结果:壹亿贰仟叁佰肆拾伍万陆仟柒佰捌拾玖点壹贰

示例2:中文转数字

  1. 在输入框中输入中文数字:五亿三千万

  2. 选择"中文转数字"选项

  3. 点击"转换"按钮

  4. 输出框显示结果:530000000

技术特点

  1. 支持超大数字:最高可处理到"无量大数"(10^68)级别的数字

  2. 小数支持:完美处理带小数点的数字转换

  3. 灵活的单位处理

    • 支持中文数字的各种单位(万、亿、兆等)

    • 正确处理单位间的组合关系

  4. 错误处理

    • 验证输入格式

    • 捕获并显示转换过程中的异常

  5. 用户友好界面

    • 清晰的输入/输出区域

    • 状态栏显示操作结果

    • 支持复制粘贴操作

界面效果

+--------------------------------------------+
| 中文数字转换器                              |
+--------------------------------------------+
| [输入]                                     |
| +----------------------------------------+ |
| |                                        | |
| |                                        | |
| |                                        | |
| +----------------------------------------+ |
|                                            |
| [转换方向:] ○数字转中文 ○中文转数字 [使用大写] [转换] |
|                                            |
| [输出]                                     |
| +----------------------------------------+ |
| |                                        | |
| |                                        | |
| |                                        | |
| +----------------------------------------+ |
|                                            |
| [状态栏:就绪]                              |
+--------------------------------------------+

应用场景

  1. 财务系统:生成发票、合同中的大写金额

  2. 教育领域:数学教学中数字的中文表示

  3. 金融领域:处理大额数字的表示和转换

  4. 文档处理:自动将数字转换为正式的中文表示

总结

这个中文数字转换工具通过精心设计的算法实现了:

  1. 双向转换:支持数字到中文和中文到数字的双向转换

  2. 大小写支持:可选择使用大写或小写中文数字

  3. 高精度处理:支持超大数字和精确的小数转换

  4. 用户友好:直观的界面设计和即时的反馈机制

在工作中这个工具都能提供准确、高效的数字转换服务。

下载

  1. 文件名批量修改V1.1.0.0:

    1. 描述:

      1. 可以将阿拉伯数字和中文数字(大小写)进行转换。

    2. 下载:

      1. 数字转换.exe