【问题标题】:DataTable.Compute fails when evaluating a decimal expression计算十进制表达式时 DataTable.Compute 失败
【发布时间】:2015-07-31 08:40:19
【问题描述】:

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

【问题讨论】:

  • 如果我运行代码,两者都可以正常工作
  • 两者都必须正常工作....!!
  • 由于某种原因,当我有单引号时,它在我这边失败了。我删除了数字周围的引号,现在它可以工作了。

标签: c# datatables evaluation


【解决方案1】:

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

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 .

让我们看看其他人是否有更好的方法来解决它。

【讨论】:

  • 谢谢@Steve。这正是导致问题的原因。它正在使用当前线程的文化。事实证明,在南非,小数分隔符是逗号而不是句点。
【解决方案2】:

根据MSDN

没有科学记数法但带有小数点的实数被视为 System.Decimal。如果数字超过 System.Decimal 支持的最大值或最小值,则将其解析为 System.Double。例如:

142526.144524 将被转换为十进制。

345262.78036719560925667 将被视为 Double。

所以只需简单地使用dt.Compute("100.1 > 3", null) 就可以了。

【讨论】:

  • 谢谢@taffer。当文化发生变化时(比如从一个环境迁移到另一个环境),这不会引起问题吗?
  • 不,因为这些是数字文字。仅当您使用字符串转换时才会出现问题。
猜你喜欢
  • 1970-01-01
  • 2012-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多