【问题标题】:Wrong result from IsNumeric() in VB.NETVB.NET 中 IsNumeric() 的错误结果
【发布时间】:2011-07-21 00:34:25
【问题描述】:

如果IsNumeric 为真,我在VB.NET 中有一个函数循环遍历值并尝试将其转换为小数,

Dim Value As String

If IsNumeric(Value) = True Then
    Rate = CType(Value, Decimal)  <--- bombing here
End If

我发现,当函数接收到值 603E43 IsNumeric 时,由于某种原因,它的计算结果为 True,然后在转换时发生炸弹。为什么IsNumeric 在这种情况下会是真的?

【问题讨论】:

  • 因为603E43 是浮点值的半标准数字表示,特别是:603*10^43。我不知道CType 是如何工作的(因为我不使用VB.NET ;-),但在C# 中我可能会使用decimal.TryParseIsNumeric 可能与 SQL Server“数字”规则更相关,其中还包括前导美元符号等。我似乎找不到任何官方的“完整”规则。
  • 轰炸是什么意思?什么是错误消息/异常?
  • 也许看到这个VB6 SO question about IsNumeric ...我假设VB.NET的IsNumeric是一个很好的克隆;-)
  • @pst,啊,听起来不错。非常感谢您提供的信息。
  • 另一方面,您不需要= True 部分。就说If IsNumeric(Value) Then ...

标签: vb.net isnumeric


【解决方案1】:

http://support.microsoft.com/kb/329488

IsNumeric 如果可以转换为 double 则返回 true,这对于 603E43 为 true 但是,该值大于小数可以容纳的值

您可以使用 Decimal.TryParse 函数作为替代方案。看 http://msdn.microsoft.com/en-us/library/9zbda557.aspx

【讨论】:

  • 就个人而言,我在所有情况下都使用IsNumeric 转而使用&lt;type&gt;.TryParse。它更加强大。
  • 啊+1。这得到了我。我正要说:“但小数是一种更广泛的类型”,因为十进制值的 size 是双精度值的两倍(128 位对 64 位)——但 范围 i> 少得多(而 precision 高得多)。小数的 范围 是 +/- 10^28,而双精度是 +/- 10^308(给或取)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
  • 1970-01-01
相关资源
最近更新 更多