You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用System.Globalization.CultureInfo.InvariantCulture时TextBox自动补零问题求助

解决TextBox未修改内容离开时自动添加两位小数的问题

你的问题出在每次触发Leave事件时,都会无条件将文本解析为double再格式化为两位小数(N2),哪怕内容没有变化。比如初始值是123,第一次离开后变成123.00;如果从整数格式的内容进入控件且未修改就离开,就会出现“自动添加零”的情况。要解决这个问题,核心是只在内容被修改时才执行格式化。

方法一:对比原始值,仅修改时格式化

  1. 在窗体类中定义变量存储TextBox进入时的原始文本:
private string _originalTextBoxText;
  1. 给TextBox添加Enter事件,记录进入控件时的文本内容:
private void textBox1_Enter(object sender, EventArgs e)
{
    _originalTextBoxText = textBox1.Text;
}
  1. 修改Leave事件代码,先判断内容是否变化,同时改用TryParse避免解析非法数字时抛异常:
private void textBox1_Leave_1(object sender, EventArgs e)
{
    // 内容未修改则直接返回,不执行格式化
    if (textBox1.Text == _originalTextBoxText)
        return;

    // 尝试解析文本,失败可添加输入无效的提示逻辑
    if (double.TryParse(textBox1.Text, System.Globalization.CultureInfo.InvariantCulture, out double parsedValue))
    {
        // 用InvariantCulture格式化,避免系统区域设置影响格式
        textBox1.Text = parsedValue.ToString("N2", System.Globalization.CultureInfo.InvariantCulture);
    }
}

方法二:检查当前文本是否已符合格式(可选)

如果不想依赖Enter事件,也可以通过正则匹配验证当前文本是否已经是两位小数格式,再决定是否执行格式化:

private void textBox1_Leave_1(object sender, EventArgs e)
{
    // 正则匹配整数或两位小数格式(兼容InvariantCulture的小数点)
    var regex = new System.Text.RegularExpressions.Regex(@"^\d+(\.\d{2})?$");
    if (regex.IsMatch(textBox1.Text))
        return;

    if (double.TryParse(textBox1.Text, System.Globalization.CultureInfo.InvariantCulture, out double parsedValue))
    {
        textBox1.Text = parsedValue.ToString("N2", System.Globalization.CultureInfo.InvariantCulture);
    }
}

内容的提问来源于stack exchange,提问作者Hariche Arquissandas

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 14:05:24