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

XML获取的数学公式字符串数字保留两位小数问题,代码无效果求助

问题排查与解决方案

原代码核心问题

  1. 正则表达式覆盖不全:
    原正则@"(\d*\.\d\d)\d*"仅匹配无负号、小数部分超过两位的数字,漏掉了负数(如-0.008)、整数(如0)以及小数部分刚好两位的数字(如1.09)。
  2. 替换逻辑错误:
    原代码中Math.Round((Decimal)Convert.ToDecimal("$1"), 2)是静态执行的,"$1"会被直接当作字符串转换,而非匹配到的分组内容,不仅会抛出格式异常,也无法针对每个匹配的数字动态处理四舍五入。

修正后的代码

string formula = "abs((0+2.315)*((-0.008)-0) + (2.315+2.323)*(1.09-(-0.008)) + (2.323+0.007)*(1.076-1.09) + (0.007+0)*(0-1.076)) * 0.500";
// 匹配所有数字:整数、小数、负数
string pattern = @"-?(?:\d+\.?\d*|\.\d+)";

formula = Regex.Replace(formula, pattern, match => 
{
    if (decimal.TryParse(match.Value, out decimal number))
    {
        // 四舍五入保留两位小数,并格式化带两位小数的字符串
        return Math.Round(number, 2).ToString("0.00");
    }
    // 转换失败时返回原匹配内容
    return match.Value;
});

// 输出结果:abs((0.00+2.32)*((-0.01)-0.00) + (2.32+2.32)*(1.09-(-0.01)) + (2.32+0.01)*(1.08-1.09) + (0.01+0.00)*(0.00-1.08)) * 0.50
Console.WriteLine(formula);

关键说明

  • 正则表达式解析:-?(?:\d+\.?\d*|\.\d+)
    • -?:匹配可选的负号
    • (?:\d+\.?\d*|\.\d+):非捕获组,匹配两种数字格式:
      • \d+\.?\d*:整数或带小数点的数字(如0、2.315)
      • \.\d+:以小数点开头的小数(如.007)
  • 动态替换逻辑:使用MatchEvaluator委托,对每个匹配到的数字字符串单独执行:
    1. 转换为decimal类型
    2. 调用Math.Round四舍五入保留两位小数
    3. 格式化为带两位小数的字符串(整数会转为0.00格式,符合需求)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:03:26