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

C#中RichTextBox数值字符串转类型求和结果错误如何解决

问题根因

计算结果错误完全是数值解析逻辑不符合输入格式导致的:

  • 你输入的数值是欧式数字记法:.为千位分隔符,,为小数分隔符,例如11.550,00实际值为11550.00
  • 第一版代码直接用Int32.Parse转整数,既没有处理分隔符,也不支持小数解析,完全不匹配输入格式要求
  • 第二版代码直接全局删除所有逗号,等于抹掉了小数分隔符,剩余的.会被解析器识别为小数点,比如11.550,00处理后变为11.55000,解析值为11.55,和真实值差1000倍,求和结果必然错误
  • 额外逻辑问题:你把计算逻辑绑定在输出控件textBox23的TextChanged事件上,修改输出内容时会递归触发事件,存在逻辑隐患
正确实现方案

不要手动替换分隔符,直接指定匹配的区域文化规则做解析,同时增加输入容错避免非法输入导致崩溃:

using System.Globalization;

// 初始化对应欧式数字格式的文化配置,匹配"点为千分位、逗号为小数位"的规则
private readonly CultureInfo euNumberCulture = new CultureInfo("de-DE");

private void CalcTotalValue()
{
    // 统一管理四个输入控件,减少重复代码
    RichTextBox[] inputControls = { richTextBox17, richTextBox18, richTextBox19, richTextBox20 };
    decimal sumTotal = 0m;

    foreach (var inputCtrl in inputControls)
    {
        string inputStr = inputCtrl.Text.Trim();
        if (string.IsNullOrWhiteSpace(inputStr)) continue;

        // 按指定格式解析数值,解析失败时当前值按0计算,避免程序崩溃
        if (decimal.TryParse(
            inputStr, 
            NumberStyles.AllowThousands | NumberStyles.AllowDecimalPoint, 
            euNumberCulture, 
            out decimal currentVal))
        {
            sumTotal += currentVal;
        }
    }

    // 输出结果,保持和输入一致的数字格式,注意替换成你实际要用的输出控件
    string outputStr = sumTotal.ToString("N2", euNumberCulture);
    richTextBox21.Text = outputStr;
    textBox23.Text = outputStr;
}

// 把计算方法绑定到四个输入框的TextChanged事件,或者绑定到计算按钮的点击事件
private void InputRichTextBox_TextChanged(object sender, EventArgs e)
{
    CalcTotalValue();
}
注意事项
  • 金额、数值类计算优先使用decimal类型,不要用double,避免二进制浮点运算带来的精度误差
  • 处理多文化格式的数字时,不要手动替换分隔符,直接调用官方的区域文化配置解析,避免边界场景出错
  • 所有用户输入的解析优先用TryParse系列方法,不要直接用Parse,防止用户输入非数字内容时触发程序崩溃
  • 不要把计算逻辑绑定在输出控件的事件上,避免递归触发导致的栈溢出或者逻辑死循环

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 02:33:07