我正在使用DataTable类的Compute方法来计算和表达。 当值为整数时,评估将起作用,当表达式为十进制值时,评估将失败。我得到了一个" System.FormatException"异常。
以下是示例代码:
var dt = new DataTable();
var passingResult = dt.Compute("CONVERT('100', 'System.Decimal') > 3", null); //works
var failingResult = dt.Compute("CONVERT('100.1', 'System.Decimal') > 3", null); //fails
答案 0 :(得分:2)
最初我无法重现您的问题,但随后使用此代码
Thread.CurrentThread.CurrentCulture = new CultureInfo("af-ZA");
var dt = new DataTable();
var passingResult = dt.Compute("CONVERT('100', 'System.Decimal') > 3", null); //works
var failingResult = dt.Compute("CONVERT('100.1', 'System.Decimal') > 3", null); //fails
我遇到了相同的格式错误,因此应用于代码的文化信息存在问题。我可以使用此代码解决它
Thread.CurrentThread.CurrentCulture = CultureInfo.InvariantCulture;
var dt = new DataTable();
passingResult = dt.Compute("CONVERT('100', 'System.Decimal') > 3", null); //works
failingResult = dt.Compute("CONVERT('100.1', 'System.Decimal') > 3", null); //fails
不确定这是否是解决问题的最佳方法,因为对于使用您的表后的代码可能会出现问题,我很确定您需要在将此更改恢复为原始文件后重置CultureInfo
让我们看看其他人是否有更好的方法来解决它。
答案 1 :(得分:1)
符合MSDN:
没有科学记数法但带小数点的真实文字被视为System.Decimal。如果该数字超过System.Decimal支持的最大值或最小值,则将其解析为System.Double。例如:
142526.144524将转换为十进制。
345262.78036719560925667将被视为双倍。
因此,只需使用dt.Compute("100.1 > 3", null)
,就可以了。