VB.NET 中 IsNumeric() 的错误结果

Posted

技术标签:

【中文标题】VB.NET 中 IsNumeric() 的错误结果【英文标题】:Wrong result from IsNumeric() in VB.NET 【发布时间】: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 ... 【参考方案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(给或取)。

以上是关于VB.NET 中 IsNumeric() 的错误结果的主要内容,如果未能解决你的问题,请参考以下文章

出现错误:“int”对象没有属性“isnumeric”

错误:表插入在 vb.net 和 msacess 中返回错误

修复 IsNumeric 循环错误?

更新语句中的 VB.NET 语法错误

在 sql 语法中出现错误,vb.net 中的 mysql update 语句

如何在 vb.net 中使用 Stacktrace 返回错误行号