【问题标题】:Check datatable column contains numeric values检查数据表列是否包含数值
【发布时间】:2012-01-12 13:39:05
【问题描述】:

我只想找到那些包含数值的行表格,所以我做了如下

dtDetails.Select(" (ISNUMERIC(OriginatingTransit)=0)")

但它会抛出异常

The expression contains undefined function call ISNUMERIC().

【问题讨论】:

  • hmmm 可能是这样的 dtDetails.Select(" ISNUMERIC(OriginatingTransit)=0 ")
  • 异常是System.Data.EvaluateException吗?如果是这样,请参阅social.msdn.microsoft.com/Forums/is/adodotnetdataset/thread/…
  • ISNUMERIC 几乎总是使用错误的函数 - 它回答了一个我从未发现有人想问的问题(“此文本是否可以转换为至少一种数字数据类型?”),而不是大多数人的常见问题(“此文本可以转换为 X 吗?”其中 X 是 特定 数据类型)。例如,1d2ISNUMERIC 定义的数字,£ 也是如此。

标签: asp.net


【解决方案1】:

您必须在数据库级别执行此操作,或者自己循环并编写一些东西来检查一个值是否可以解析为一个数字。 Select 方法不支持您尝试执行的操作:Expression property on MSDN, contains info about what's supported

bool IsNumeric(object o)
{
  decimal result_ignored;
  return o != null && 
    !(o is DBNull) && 
    decimal.TryParse(Convert.ToString(o), out result_ignored);
}

然后你可以这样做:

var filtered = dtDetails.Rows.Cast<DataRow>().
  Where(r => IsNumeric(r["OriginatingTransit"]));

如果您随后枚举filtered,您将只获得该列中具有数值的那些。

这并不完美 - 因为正如一些 cmets 在 the answer linked to 上提到的那样,在上面的 cmets 问题中,“是数字”的确切含义是松散的。我认为,这是通过使用decimal 尝试解析值来进行的最广泛的描述。如果您的要求更严格,您可以使用不同的类型(例如 intfloat)或正则表达式。

【讨论】:

  • 我只想检查整数,如果我更改 int.parse,这可能会起作用
猜你喜欢
  • 2022-11-23
  • 2023-03-26
  • 1970-01-01
  • 1970-01-01
  • 2019-08-10
  • 1970-01-01
  • 2015-01-01
  • 2021-07-15
  • 1970-01-01
相关资源
最近更新 更多