4

如果我尝试

Double.Parse("Infinity")

我明白了

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

为什么?如果无论如何我都想解析它并获得一个值为 Infinity 的 Double,我该怎么办?

4

5 回答 5

11

我刚刚发现了这一点:

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

将工作并返回值为 +Infinity 的双精度数。

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

于 2013-08-23T09:12:14.970 回答
8

以下所有解析都是有效的,因为您的系统设置不同导致了问题。正如dontomaso上面回答的那样,只需要添加 Invariant Culture。

Double.Parse("NaN", System.Globalization.CultureInfo.InvariantCulture)
Double.Parse("-Infinity", System.Globalization.CultureInfo.InvariantCulture)
Double.Parse("Infinity", System.Globalization.CultureInfo.InvariantCulture)
于 2013-08-23T09:21:24.853 回答
6

也许试试这个:

if(yourstring.ToLower() == "infinity")
{
   yourdouble = double.PositiveInfinity;
}
于 2013-08-23T08:53:45.210 回答
2

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

double infinity = double.PositiveInfinity;
于 2013-08-23T08:54:27.730 回答
0

.NET 根据区域性解析无穷大和负无穷大的行为不一致。

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

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

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

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

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

解决方法

如果您不介意添加一个额外的辅助方法,您可以通过更改NumberFormatInfo.PostiveInfinitySymbolandNumberFormatInfo.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")));
于 2021-05-08T04:25:14.277 回答