我应该如何用Double解析Infinity?

时间:2013-08-23 08:52:21

标签: c# parsing double infinity

如果我尝试

Double.Parse("Infinity")

我得到了

Double.Parse("Infinity") threw an exception of type 'System.FormatException'

为什么呢?如果我想要解析它并获得具有无穷大值的Double,我该怎么办?

5 个答案:

答案 0 :(得分:8)

我刚刚发现了这个:

Decimal.Parse("Infinity", System.Globalization.CultureInfo.InvariantCulture);

将起作用并返回值为+ Infinity的双精度。

它不起作用的原因是,我认为,我不是自动在InvariantCulture中,但可能在de-DE文化中,它不能处理确切的字符串“Infinity”。 (也许它会处理其他一些字符串。)

答案 1 :(得分:6)

也许试试这个:

if(yourstring.ToLower() == "infinity")
{
   yourdouble = double.PositiveInfinity;
}

答案 2 :(得分:5)

以下所有解析均有效,因为 系统设置不同导致问题 。正如dontomaso上面回答的那样,只需添加不变文化。

Double.Parse("NaN", System.Globalization.CultureInfo.InvariantCulture)
Double.Parse("-Infinity", System.Globalization.CultureInfo.InvariantCulture)
Double.Parse("Infinity", System.Globalization.CultureInfo.InvariantCulture)

答案 3 :(得分:2)

你可以使用double.PositiveInfinity。这个常数的值是将正数除以零的结果。

double infinity = double.PositiveInfinity;

答案 4 :(得分:0)

.NET 在解析无穷大和负无穷大方面的行为不一致,具体取决于文化。

如果您使用的是 CultureInfo.InvariantCulture,则要使用的字符串是 "Infinity""-Infinity"

var infinity = double.Parse("Infinity", CultureInfo.InvariantCulture);
var negativeInfinity = double.Parse("-Infinity", CultureInfo.InvariantCulture);

但是,如果您处于特定文化中,则要使用的字符串是 "∞""-∞"

var infinity = double.Parse("∞", new CultureInfo("en-US"));
var negativeInfinity = double.Parse("-∞", new CultureInfo("en-US"));

不幸的是,似乎没有默认情况下可以解析为无穷大和负无穷大的字符串在每种文化中都有效,包括 CultureInfo.InvariantCulture。如果您尝试使用 "∞" 解析 "-∞"CultureInfo.InvariantCulture,它将抛出一个 FormatException

解决方法

如果您不介意添加一个额外的辅助方法,您可以通过更改 NumberFormatInfo.PostiveInfinitySymbolNumberFormatInfo.NegativeInfinitySymbol 使每种文化都解析您想要的字符串来使其在任何文化中都能正常工作。

public static IFormatProvider NormalizeInfinity(
    string positiveInfinitySymbol = "Infinity",
    string negativeInfinitySymbol = "-Infinity")
{
    return NormalizeInfinity(CultureInfo.CurrentCulture, positiveInfinitySymbol, negativeInfinitySymbol);
}

public static IFormatProvider NormalizeInfinity(
    IFormatProvider provider,
    string positiveInfinitySymbol = "Infinity",
    string negativeInfinitySymbol = "-Infinity")
{
    NumberFormatInfo numberFormat;
    if (provider is null)
    {
        numberFormat = (NumberFormatInfo)CultureInfo.InvariantCulture.NumberFormat.Clone();
    }
    else
    {
        numberFormat = (NumberFormatInfo)((NumberFormatInfo)provider.GetFormat(typeof(NumberFormatInfo))).Clone();
    }
    numberFormat.PositiveInfinitySymbol = positiveInfinitySymbol;
    numberFormat.NegativeInfinitySymbol = negativeInfinitySymbol;
    return numberFormat;
}
用法
double infinity = double.Parse("Infinity", NormalizeInfinity());
double negativeInfinity = double.Parse("-Infinity", NormalizeInfinity());

double aDouble = double.Parse("1.23456", NormalizeInfinity());

double notANumber = double.Parse("NaN", NormalizeInfinity());

请注意,无论您是否将 CultureInfo.CurrentCulture 设置为 CultureInfo.InvariantCulture,上述内容都适用于无穷大和负无穷大的相同符号。

您也可以通过任何文化,它会改变无穷大和负无穷大设置,但保持所有其他设置不变。

double infinity = double.Parse("Infinity", NormalizeInfinity(new CultureInfo("de")));