Double.Parse("NaN")能够正确解析吗?

4
C#中的Double类型是否能正确解析"NaN",即Double.Parse("NaN").ToString() == "NaN"是否成立?

LinqPad 对于我来说返回 True,因为 Double.Parse("NaN").ToString() == "NaN" - Blorgbeard
请注意,“NAN”会生成解析异常。当我将C++程序中的double作为字符串发送到.NET程序时就遇到了这个问题。 - Lumo
@参与者 NaN 永远不等于 NaN。永远不!正确的测试应该是 float.isNaN(Double.Parse("NaN")) == true - Петър Петров
@ПетърПетров 为什么要解析双精度浮点数并测试float.IsNaN? - participant
@参与者 我的复制粘贴错误 :D - Петър Петров
2个回答

8
var d = Double.Parse("NaN");
Console.WriteLine(d); // prints "NaN"

我正在使用en-US本地化运行。正如Joey所指出的那样,需要小心处理。当我指定不变性文化(在这种情况下通常应该这样做)时,我得到了相同的结果:

var d = Double.Parse("NaN", CultureInfo.InvariantCulture);
Console.WriteLine(d.ToString(CultureInfo.InvariantCulture)); // prints "NaN"

WriteLine 在我的系统上会打印 n. def.。如果你正在传递显式的文化信息,那么在打印数值时也必须这样做。 - Joey
@Joey:说实话,这个想法没有出现在我的脑海中 - 我认为“NaN”是跨语言环境不变的,有点像用来识别周期表元素的符号。已更改;谢谢。 - Michael Petrotta
1
检查 CultureInfo.CurrentCulture.NumberFormat.NaNSymbol。如果您有一个不是只读的 NumberFormatInfo(例如,您可以使用 Clone 获取一个),甚至可以将自己喜欢的字符串分配给 NaNSymbol - Jeppe Stig Nielsen

7

试一试:

PS> $ic = [Globalization.CultureInfo]::InvariantCulture
PS> [double]::parse('NaN', $ic).ToString($ic)
NaN

然而,对该字符串进行解析和输出是与地区相关的,因此请确保始终传递正确的文化信息或者不要对格式做出太多假设。


是的,我在第一次尝试中遇到了本地化问题。 - Joey
5
PowerShell,没错。这是一种快速尝试.NET内容的好方法,无需启动ConsoleApplication2345和Visual Studio。 - Joey

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接