评估十进制表达式时,DataTable.Compute失败

时间:2015-07-31 08:40:20

标签: c# datatables evaluation

我正在使用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

2 个答案:

答案 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),就可以了。