使用System.Globalization.CultureInfo.InvariantCulture时TextBox自动补零问题求助
解决TextBox未修改内容离开时自动添加两位小数的问题
你的问题出在每次触发Leave事件时,都会无条件将文本解析为double再格式化为两位小数(N2),哪怕内容没有变化。比如初始值是123,第一次离开后变成123.00;如果从整数格式的内容进入控件且未修改就离开,就会出现“自动添加零”的情况。要解决这个问题,核心是只在内容被修改时才执行格式化。
方法一:对比原始值,仅修改时格式化
- 在窗体类中定义变量存储TextBox进入时的原始文本:
private string _originalTextBoxText;
- 给TextBox添加
Enter事件,记录进入控件时的文本内容:
private void textBox1_Enter(object sender, EventArgs e) { _originalTextBoxText = textBox1.Text; }
- 修改
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
相关产品推荐
相关产品推荐

