XML获取的数学公式字符串数字保留两位小数问题,代码无效果求助
问题排查与解决方案
原代码核心问题
- 正则表达式覆盖不全:
原正则@"(\d*\.\d\d)\d*"仅匹配无负号、小数部分超过两位的数字,漏掉了负数(如-0.008)、整数(如0)以及小数部分刚好两位的数字(如1.09)。 - 替换逻辑错误:
原代码中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委托,对每个匹配到的数字字符串单独执行:- 转换为
decimal类型 - 调用
Math.Round四舍五入保留两位小数 - 格式化为带两位小数的字符串(整数会转为
0.00格式,符合需求)
- 转换为
内容的提问来源于stack exchange,提问作者alexpj
相关产品推荐
相关产品推荐

