Как мне анализировать числа с плавающей запятой и удваивать их без учета регистра в c # (чтобы охватить «бесконечность» и т. Д.)?

1

В моей локали double.Parse("Infinity") возвращает double.PositiveInfinity, но double.Parse("infinity") выдает System.FormatException. Аналогичные вещи происходят для отрицательной бесконечности и NaN.

Я мог бы просто использовать CultureInfo.CurrentCulture.NumberFormat.PositiveInfinitySymbol.Equals() с нечувствительным к регистру сравнением для проверки соответствия перед вызовом double.Parse() (и делать аналогично для отрицательной бесконечности и NaN). Однако я надеялся на что-то более элегантное.

  • 0
    Какова ваша CurrentCulture ?
  • 0
    @Soner Mine случается в США с настройкой формата даты, но я бы хотел поддержать произвольные значения CurrentCulture.
Показать ещё 2 комментария
Теги:
floating-point
parsing
floating-point-conversion

3 ответа

1
Лучший ответ

Я не вижу много вариантов, кроме TryParse(), и при сбое Number.ParseDouble() три специальных Number.ParseDouble() как показано в Number.ParseDouble() и double.TryParse(). Я бы сделал чек после, а не раньше, так как в большинстве случаев этого не произойдет.

  • 0
    Ваши ссылки являются убедительным доказательством того, что лучшего способа нет. Мне также нравится ваше предложение сделать редкий случай как второе усилие вместо общего пути.
1

Глядя на метод Parse for double, это не похоже, что у вас много комнаты для маневра:

// 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 который используется здесь, не позволяет вам изменять чувствительность к регистру, я думаю, что вам следует исследовать в пользовательских расширениях для вашего синтаксического анализа, возможно, добавив метод AsDouble поверх string.

0

Вы хотите поддерживать имена текущей культуры, поэтому, если это "de-DE" "+unendlich" должно быть успешно обнаружено как PositiveInfinitySymbol? Не понятно, контролируется ли вход вами или нет.

Вы:

Если пользователь CurrentCulture "de-DE", мне бы хотелось, чтобы "+unendlich" (который был PositiveInfinitySymbol) успешно анализировался как double.PositiveInfinity. Мне также хотелось бы, чтобы "+unendlich" и "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);

Ещё вопросы

Сообщество Overcoder
Наверх
Меню