C# Windows Forms 实现进制与物理单位实时换算器
使用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) 项目。拖入以下控件以布局界面:
- 四个
TextBox(textBox1至textBox4),分别用于显示四种不同进制的数值或前四个标准单位值。 - 第五个
TextBox(textBox5),用于显示额外选定的单位值,初始状态设为只读。 - 一个
ComboBox(unitComboBox),用于选择大类(如“长度”、“面积”)。 - 一个
ListBox(unitListBox),当大类选定后弹出具体单位选项。 - 对应数量的
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#窗口编程技巧的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













