【问题标题】:Double.TryParse - not working properlyDouble.TryParse - 无法正常工作
【发布时间】:2015-05-26 09:59:22
【问题描述】:

当进入检查以下代码的值“NaN”被识别为双重解析的正确值并进入 if 和 nto else 时,我感到很惊讶...你知道为什么会这样以及如何更好地保护我的代码避免这种情况。只有当数字可以转换为双精度时,值才应该去。

 If Double.TryParse(array(3), doubleitem) Then

                array(3) = doubleitem
            Else
                array(3) = Nothing
            End If

【问题讨论】:

  • 当 array(3) 的值为“NaN”时,它进入了行:array(3) = doubleitem
  • 出于特定原因,我只需要一个我无法弄清楚 Double.Try 解析将某些字符串识别为 Parse 的 cooreect 值的原因。如何避免这种情况?我认为 Double.TryParse 就足够了,但似乎还不够。
  • 在我的情况下不是这样。数组为字符串类型
  • 试试 && doubleitem Double.NaN ?
  • 我明白了,如果我使用InvariantCultureDouble.TryParse("NaN",NumberStyles.None, CultureInfo.InvariantCulture, doubleitem),它会返回 true。在我的文化中(de-de)`doubleitem.ToString 返回"n. def."

标签: vb.net


【解决方案1】:

这不是Double.TryParse的不当行为,而是你的误会。
Double 结构实际上包含一个名为NaN 的常量,它表示一个不是数字的值。 因此,当您对字符串 "NaN" 执行 Double.TryParse 时,您的结果是 Double.NaN,这是 double 的有效值。

把你的条件改成这个

If Double.TryParse(array(3), doubleitem) andalso not Double.IsNaN(doubleitem) Then
     array(3) = doubleitem
Else
     array(3) = Nothing
End If

一切都应该正常。

【讨论】:

  • 是否有其他情况可以添加以避免类似情况或足够?
  • @StackUser:首先使用正确的数据类型。为什么在存储数字的数组中有NaN 之类的字符串?
  • 我不这么认为,我尝试使用简单的.net fiddle 来测试其他 Double 常量,但它们似乎没有通过 Double.TryParse。
【解决方案2】:

您可以尝试使用InvariantCulture 解析它(因为其他语言对NaN 使用不同的名称),然后明确检查它是否为<> Double.NaN

If Double.TryParse(array(3), NumberStyles.Float, CultureInfo.InvariantCulture, doubleitem) _
    AndAlso Not double.IsNaN(doubleitem) Then
    ' ... '
Else
    ' ... '
End If

您必须使用Double.IsNan 来检查数字是否为双精度数,you cannot compare it

【讨论】:

  • 其实你不能使用<> Double.NaN,因为它总是返回true。
  • 这个版本不工作,但感谢蒂姆的支持
  • 我自己注意到了,使用double.IsNaN(doubleitem)
  • 现在确定哪个版本“更好”,在您的 Tim 中,您还添加了 CultureInfo。
  • 如果您在多语言环境中工作,请选择使用 CultureInfoTryParse 重载。
【解决方案3】:

三个正确的解决方案是:

Console.WriteLine( 0/zero = Double.NaN )
Console.WriteLine( 0/zero <> Double.NaN )
Console.WriteLine( Double.IsNaN(0/zero) )

0/zero 是你的双重项目。

https://msdn.microsoft.com/en-us/library/bb264491.aspx

【讨论】:

    猜你喜欢
    • 2016-12-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    • 2012-07-11
    • 2018-04-08
    • 2017-04-20
    • 2018-10-02
    • 2016-09-04
    相关资源
    最近更新 更多