如何在c#中不区分大小写地解析浮点数和双精度数(以涵盖“无穷大”等)

本文关键字:无穷大 双精度 浮点数 不区 大小写 | 更新日期: 2023-09-27 18:18:35

在我的语言环境中,double.Parse("Infinity")返回double.PositiveInfinity,但double.Parse("infinity")抛出System.FormatException。类似的事情也发生在负无穷和NaN上。

我显然可以在调用double.Parse()之前使用CultureInfo.CurrentCulture.NumberFormat.PositiveInfinitySymbol.Equals()与不区分大小写的比较来检查匹配(并且对负无穷大和NaN也这样做)。然而,我希望有更优雅的东西

如何在c#中不区分大小写地解析浮点数和双精度数(以涵盖“无穷大”等)

除了执行TryParse()之外,我没有看到太多选择,如果失败,则对三个特殊标记进行特殊大小写,如Number.ParseDouble()double.TryParse()所示。我将在之后而不是之前进行检查,因为在大多数情况下,这不会发生。

查看double的Parse方法,它看起来没有太多的回旋余地:

// double
private static double Parse(string s, NumberStyles style, NumberFormatInfo info)
{
    double result;
    try
    {
        result = Number.ParseDouble(s, style, info);
    }
    catch (FormatException)
    {
        string text = s.Trim();
        if (text.Equals(info.PositiveInfinitySymbol)) // case-sensitive comparison
        {
            result = double.PositiveInfinity;
        }
        else
        {
            if (text.Equals(info.NegativeInfinitySymbol)) // case-sensitive comparison
            {
                result = double.NegativeInfinity;
            }
            else
            {
                if (!text.Equals(info.NaNSymbol)) // case-sensitive comparison
                {
                    throw;
                }
                result = double.NaN;
            }
        }
    }
    return result;
}

由于这里使用的Equals方法不允许您更改大小写敏感性,因此我认为您应该在分析的自定义扩展中进行研究,也许可以在string之上添加AsDouble方法。

您想要支持当前区域性的名称,所以如果它是"de-DE" "+unendlich"应该被成功检测为PositiveInfinitySymbol ?不清楚输入是否由你控制。

:

如果用户的CurrentCulture是"de-DE",我想要"+unendlich"(即PositiveInfinitySymbol)成功解析为double.PositiveInfinity。我还想要"+Unendlich"answers"UNENDLICH"解析为相同的值。

那你的方法绝对没问题,不是吗?你可以这样写一个方法:

public static bool ParseDoubleExt(string input, out double doubleVal, StringComparison comparison = StringComparison.CurrentCultureIgnoreCase, NumberFormatInfo nfi = null)
{
    if (nfi == null)
        nfi = NumberFormatInfo.CurrentInfo;
    doubleVal = double.MinValue;
    double d;
    if (double.TryParse(input, out d))
    {
        doubleVal = d;
        return true;
    }
    else
    {
        bool isPosInf = nfi.PositiveInfinitySymbol.Equals(input, comparison);
        if (isPosInf)
        {
            d = double.PositiveInfinity;
            return true;
        }
        bool isNegInf = nfi.NegativeInfinitySymbol.Equals(input, comparison);
        if (isNegInf)
        {
            d = double.NegativeInfinity;
            return true;
        }
        bool isNAN = nfi.NaNSymbol.Equals(input, comparison);
        if (isNAN)
        {
            d = double.NaN;
            return true;
        }
        // to be extended ...
    }
    return false;
}

,并这样使用:

string doubleStr = "+UNENDLICH";
double d;
bool success = ParseDoubleExt(doubleStr, out d);
相关文章: