为什么C#TryParse不处理NaN?

为什么C#TryParse不处理NaN?,c#,tryparse,C#,Tryparse,在读取一些旧的Fortran数据时,我有一些使用默认值覆盖进行解析的常用方法。有时数据有NaN(不是数字)其中应该有一个数值。我预计TryParse会看到字符串“NaN”并且无法解析。但是,TryParse成功解析并将数值放入NaN。这是预期的行为吗?如果这是意料之中的,那么我还应该寻找其他的“gotcha”值吗 public static double GetDoubleFromString(string s, double defaultOnFailure = 0) {

在读取一些旧的Fortran数据时,我有一些使用默认值覆盖进行解析的常用方法。有时数据有
NaN(不是数字)
其中应该有一个数值。我预计TryParse会看到字符串“NaN”并且无法解析。但是,TryParse成功解析并将数值放入
NaN
。这是预期的行为吗?如果这是意料之中的,那么我还应该寻找其他的“gotcha”值吗

    public static double GetDoubleFromString(string s, double defaultOnFailure = 0)
    {
        //Must be here due to TryParse returning NaN to d and result is set to true below
        if (s.Contains("NaN"))
        {
            log.Warn(string.Format("String contained NaN, returning defaultOnFailure {0} string was {1}", defaultOnFailure, s));
            return defaultOnFailure;
        }

        var d = defaultOnFailure;
        if (!double.TryParse(s.Trim(), out d))
        {
            log.Warn(string.Format("Failed to parse double from string returning defaultOnFailure {0} string was {1}", defaultOnFailure, s));
        }

        return d;
    }
更新

我觉得应该提到的是,这种情况只发生在double、long和int上,不返回NaN值。请参阅下面的示例代码,公共。。。。代码只是格式化了Console.WriteLine或停止控制台执行。有关输出,请参见下面的屏幕截图

    public static void NanTestMain()
    {
        Common.WriteBlankWithTitle("Test parse NaN");
        string s = "NaN";

        Common.WriteBlankWithTitle("NaN to Int");
        int i;
        var intSuccess = int.TryParse(s, out i);
        Console.WriteLine(string.Format("Int parse of {0} parse = {1}", i, intSuccess));

        Common.WriteBlankWithTitle("NaN to Double");
        double d;
        var doubleSuccess = double.TryParse(s, out d);
        Console.WriteLine(string.Format("Double parse of {0} parse = {1}", d, doubleSuccess));

        Common.WriteBlankWithTitle("NaN to Long");
        long l;
        var longSuccess = long.TryParse(s, out l);
        Console.WriteLine(string.Format("Long parse of {0} parse = {1}", l, longSuccess));

        Common.Pause();
    }
是双精度的有效值,因此这是正常的。 还有负无穷大和正无穷大。检查其他可能的“特殊”值。

来自:

s参数可以包含,也可以包含由提供程序指示的区域性


有三个“特殊”值需要注意。然而,最后几个词是关键-根据当前的文化,您可能会看到除“NaN”之外的内容

每天我发现我知道的越来越少。谢谢你回答我所有的问题。在你问这个问题之前,我也不知道这些符号的存在。根据您的使用情况,您可能还想查看有关
Double.TryParse
的其他选项的信息。我认为这是非常错误的。我必须为这些特殊值添加代码测试。我认为你真的想要这种行为是非常罕见的。至少出于我的目的,我发现在要解析的值前面加一个零可以解决这个问题。“0NaN”或“0bad”引发预期错误。“07.3”预计为7.3。如果希望“”抛出错误,则此操作无效。在大多数情况下,对我来说,在这种情况下得到零是一种好处。Jacob的答案与MSDN链接稍微接近,这仍然是有用的。