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)
就可以了。
我正在使用 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)
就可以了。