使用mXparser设置decimal类型Argument时遇到异常问题
解决mXparser中Argument设置decimal值时的异常问题
看起来你遇到的问题大概率是decimal转字符串时的格式兼容性问题导致mXparser解析失败。让我拆解一下原因和对应的解决方案:
问题根源
你的代码通过字符串拼接的方式创建Argument:
new Argument("x" + i + "=" + argumentsValues[i-1])
当decimal类型的值自动转换为字符串时,默认会遵循当前系统的区域设置。比如在使用逗号作为小数点分隔符的地区(如波兰、德国等),123.45m会被转成"123,45",而mXparser的表达式语法要求使用点号作为小数点分隔符,这就会直接导致Argument解析失败,抛出异常。
两种可行的解决方案
方案1:使用强类型构造函数(推荐)
mXparser的Argument类提供了直接接收参数名和数值的构造函数,完全避免字符串拼接带来的格式问题。只需把decimal转成double(如果你的业务场景允许微小的精度损失,毕竟mXparser内部主要基于double进行计算):
public void SetArguments(List<decimal> argumentsValues) { _x = new List<Argument>(); var argsNumber = argumentsValues.Count; for (int i = 1; i <= argsNumber; i++) // 使用强类型构造函数,转换decimal为double _x.Add(new Argument($"x{i}", (double)argumentsValues[i-1])); // 简化Expression初始化逻辑 _expression = argsNumber switch { 1 => new Expression(_base, f, _x[0]), 2 => new Expression(_base, f, _x[0], _x[1]), _ => _expression // 可补充多参数或无参数的处理逻辑 }; }
方案2:强制使用不变文化格式化字符串
如果必须严格保留decimal的字符串格式(比如极端精度场景),可以在转字符串时指定InvariantCulture,确保输出的小数点为点号:
public void SetArguments(List<decimal> argumentsValues) { _x = new List<Argument>(); var argsNumber = argumentsValues.Count; var invariantCulture = System.Globalization.CultureInfo.InvariantCulture; for (int i = 1; i <= argsNumber; i++) _x.Add(new Argument($"x{i}={argumentsValues[i-1].ToString(invariantCulture)}")); // 原Expression初始化逻辑不变 if (argsNumber == 1) { _expression = new Expression(_base, f, _x[0]); } if(argsNumber==2) { _expression = new Expression(_base, f, _x[0], _x[1]); } }
额外小贴士
如果能补充异常的具体信息(比如抛出的异常类型、错误提示),可以更精准地定位问题,但根据你的代码场景,上面两个方案应该能解决_x[0]的异常问题。
内容的提问来源于stack exchange,提问作者Krzysztof Skubała
相关产品推荐
相关产品推荐

