数据表.计算小数表达式时失败
本文关键字:失败 表达式 小数 计算 数据表 | 更新日期: 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)
就可以了