C# Windows Forms 实现进制与物理单位实时换算器

蓝鲸
蓝鲸
发布时间:2026-10-16 | 4人浏览过
原创

使用C# WinForms构建具备自动换算功能的进制转换器,同时集成毫米至公里及英制单位的物理量计算。核心逻辑基于输入框的事件监听与正则表达式校验,实现毫秒级的多维度单位同步更新。

设计思路与功能范围

该应用程序旨在提供两个主要维度的换算服务:

  • 进制转换:在 Binary (Bin)、Octal (Oct)、Decimal (Dec) 和 Hexadecimal (Hex) 之间进行实时互转。
  • 物理量转换:涵盖长度(mm至km及英制)、面积(m²至km²及英制)和体积(cm³至m³及英制)。支持用户在标准公制单位和英尺、英寸等英制单位间切换。

核心操作逻辑

第1步:构建基础界面并绑定事件

启动 Visual Studio 创建一个新的 C# Windows Forms App (.NET Framework) 项目。拖入以下控件以布局界面:

  1. 四个 TextBox(textBox1 至 textBox4),分别用于显示四种不同进制的数值或前四个标准单位值。
  2. 第五个 TextBox(textBox5),用于显示额外选定的单位值,初始状态设为只读。
  3. 一个 ComboBox(unitComboBox),用于选择大类(如“长度”、“面积”)。
  4. 一个 ListBox(unitListBox),当大类选定后弹出具体单位选项。
  5. 对应数量的 Label 用于标注单位缩写(如 mm, m, Bin 等)。

在窗体构造函数中调用 InitializeComponent(),并在窗体的 Load 事件中为 unitComboBox 添加 "进制", "长度", "面积", "体积" 选项。同时将各文本框的 TextChanged 事件绑定到同一个处理方法 textBox_TextChanged。

第2步:处理进制间的实时计算

当用户选中“进制”模式时,程序会根据用户当前编辑的框,识别对应的进制类型(通过 Regex 判断数字特征),并将该值转换为其他三种格式。

private void BaseConversion(TextBox text, string val)
{
    if (text == textBox1 && Regex.IsMatch(val, @"[0-1]+$"))
    {
        long oct = Convert.ToInt64(val, 2);
        textBox2.Text = Convert.ToString(oct, 8);
        textBox3.Text = oct.ToString();
        textBox4.Text = Convert.ToString(oct, 16);
    }
    else if (text == textBox2 && Regex.IsMatch(val, @"[0-7]+$"))
    {
        long oct = Convert.ToInt64(val, 8);
        textBox1.Text = Convert.ToString(oct, 2);
        textBox3.Text = oct.ToString();
        textBox4.Text = Convert.ToString(oct, 16);
    }
    // ... 其他进制判断逻辑类似
}

第3步:实施物理单位换算与系数管理

对于长度、面积和体积,所有单位统一换算到一个基准单位上,再乘以目标单位的比率。例如在长度模式中,若 unitItem 等于 "长度":

  • textBox1 视为毫米 (mm),则 textBox2 (cm) 结果为 val * 0.1。
  • textBox4 千米 (km) 转为 毫米则为 val * 1000_000。

当用户在 unitListBox 中选择额外的英制单位时,程序会记录一个全局变量 customConversionBase。例如选择英寸 (inch) 时,系数为 0.039_37(米转英寸的倒数关系,代码中表现为毫米/厘米转米的倍数关系处理)。

/*
* 单位度量选择触发刷新
*/
private void unitListBox_SelectedIndexChanged_1(object sender, EventArgs e)
{
    textBox5.ReadOnly = false;
    if (unitListBox.SelectedItem != null)
    {
        label5.Text = unitListBox.SelectedItem.ToString();
        switch (label5.Text)
        {
            case "inch":
                customConversionBase = 0.039_37;
                break;
            case "foot":
                customConversionBase = 0.003_281;
                break;
            // ... 其他单位设定 ...
        }
    }
}

选定特定单位后,输入框解除只读限制,此时再次输入数值即可触发上述换算算法:

第4步:统一的输入校验与分发入口

所有文本框共享一个 TextChanged 事件处理器,首先检查输入是否为空,再通过正则过滤非数字字符(确保为正整数或正小数)。

private void textBox_TextChanged(object sender, EventArgs e)
{
    try
    {
        TextBox text = (TextBox)sender;
        string val = text.Text;
        if (string.IsNullOrEmpty(val)) return;

        if (unitItem == "进制")
        {
            BaseConversion(text, val);
        }
        else if (Regex.IsMatch(val, @"(^[0-9]{1,}$)|(^[0-9]+(\.[0-9]{1,})$)"))
        {
            switch (unitItem)
            {
                case "长度": lengthConversion(text, val); break;
                case "面积": areaConversion(text, val); break;
                case "体积": volumeConversion(text, val); break;
            }
        }
    }
    catch {}
}

第5步:重置逻辑与清空输入

为了防止数据混淆,当用户切换大类单位(如在unitComboBox_SelectedIndexChanged中)时,必须清空所有文本框结果,并将 customConversionBase 复位为 0。这保证了从“面积”切回“长度”时不会残留之前的系数错误。

关键技术细节说明

  • Regex 验证:使用 @"(^[0-9]{1,}$)|(^[0-9]+(\.[0-9]{1,})$)" 允许用户输入正数和小数,避免非法字符导致 Convert.ToDouble 抛出异常。
  • 数据类型:物理量计算采用 double 以保证精度;进制计算中间过程采用 long,防止溢出常见应用场景下的整数限制。
  • 扩展性:当前的结构是开关式的(Switch-case),若需增加新的单位或进制类型,只需在对应的转换函数和 Listbox 的初始化部分追加 Case 即可。

以上就是C#实现进制与单位换算器的详细内容,更多关于C#窗口编程技巧的资料请关注本站其它相关文章!

相关标签:

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表