数据表.计算小数表达式时失败

本文关键字:失败 表达式 小数 计算 数据表 | 更新日期: 2023-09-27 18:05:46

我使用DataTable类的Compute方法来计算和表达。当值是整数时,计算正常;当表达式是小数时,计算失败。我得到了一个"系统"。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

不确定这是否是解决它的最佳方法,因为它可能是有问题的代码,遵循你的表的使用,我很确定,你需要重置你的CultureInfo后,这个变化回到你原来的一个。

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

根据MSDN:

没有科学记数法但带有小数点的实际文字被视为System.Decimal。超过系统支持的最大值或最小值。十进制,然后解析为System.Double。例如:

142526.144524将被转换为十进制。

345262.78036719560925667将被视为Double。

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