DataTable.Compute 计算小数表达式时失败

DataTable.Compute fails when evaluating a decimal expression

我正在使用 DataTable class 的计算方法来计算和表达。 当值为整数时,评估有效,当表达式为小数值时,评估失败。我收到 "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

最初我无法重现您的问题,但后来使用此代码

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

不确定这是否是解决问题的最佳方法,因为使用 table 之后的代码可能会出现问题,我很确定您需要在此之后重置 CultureInfo改回原来的那个。

看看有没有人有更好的解决办法

根据MSDN:

Real literals without scientific notation, but with a decimal point, are treated as System.Decimal. If the number exceeds the maximum or minimum values supported by System.Decimal, then it is parsed as a System.Double. For example:

142526.144524 will be converted to a Decimal.

345262.78036719560925667 will be treated as a Double.

所以只用dt.Compute("100.1 > 3", null)就可以了。