Подтвердить что ты не робот

Почему double.TryParse( "0.0000", out doubleValue) возвращает false?

Я пытаюсь проанализировать строку "0.0000" с помощью double.TryParse(), но я не знаю, почему она вернет false в этом конкретном примере. Когда я передаю целые строки, например. "5" правильно анализирует значение 5.

Любые идеи, почему это происходит?

4b9b3361

Ответ 1

он учитывает параметры локализации во время выполнения... возможно, вы используете это в системе, где . не является десятичной точкой, а , вместо этого...

В вашем конкретном случае я предполагаю, что вы хотите фиксированную культуру, независимо от того, в какой системе вы работаете с . в качестве десятичной точки:

double.TryParse("0.0000", NumberStyles.Number, CultureInfo.CreateSpecificCulture ("en-US"), out temp)

ИЛИ

double.TryParse("0.0000", NumberStyles.Number,CultureInfo.InvariantCulture, out temp)

Некоторые ссылочные ссылки MSDN:

Ответ 2

TryParse по умолчанию использует текущую культуру. И если ваша текущая культура использует десятичный разделитель, отличный от ., он не может разобрать 0.0000, как вы планируете. Поэтому вам нужно пройти CultureInfo.InvariantCulture.

var numberStyle = NumberStyles.AllowLeadingWhite |
                 NumberStyles.AllowTrailingWhite |
                 NumberStyles.AllowLeadingSign |
                 NumberStyles.AllowDecimalPoint |
                 NumberStyles.AllowThousands |
                 NumberStyles.AllowExponent;//Choose what you need
double.TryParse( "0.0000", numberStyle, CultureInfo.InvariantCulture, out myVar)

Ответ 3

Почти наверняка проблема заключается в том, что Thread.CurrentCulture не использует точку в качестве десятичного разделителя.

Если вы знаете, что число будет всегда отформатировано в виде десятичного разделителя, используйте этот код, который использует другую перегрузку double.TryParse:

style = NumberStyles.Float | NumberStyles.AllowThousands;
culture = CultureInfo.InvariantCulture;
float num;
if (double.TryParse("0.0000", style, culture, out num)) {
    // whatever
}

Ответ 4

Он вернет false, если текущая культура указывает разделитель десятичной точки, который отличается от символа ..

При анализе представления строк вам нужно знать, в какой культуре они представлены, иначе вы получите неожиданное поведение.

В этом случае вы получаете false, но это может быть даже хуже, например, в следующем примере, если вы ожидали получить номер один, вместо этого вы получите тысячу:

Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-PT");

double d;
Console.WriteLine(double.TryParse("1.000", out d));
Console.WriteLine(d);

Это связано с тем, что в культуре pt-PT символ . используется как NumberGroupSeparator, а символ , используется как NumberDecimalSeparator.

Если вводимый вами ввод выполняется от пользователя, тогда он всегда анализирует его, используя культуру, с которой связан пользователь. Получение культуры, которую пользователь связывает, зависит от контекста, например, в приложении Windows Forms вы используете Thread.CurrentThread.CurrentCulture, когда в потоке пользовательского интерфейса, чтобы получить его. В приложении ASP.NET это может быть другим.

Ответ 5

Чтобы изменить культуру на то, что имеет "." как использование десятичного разделителя:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");

Ответ 6

Когда этот метод возвращает, содержит плавучую точку с двойной точностью число, эквивалентное параметру s, если преобразование выполнено успешно или ноль, если преобразование не удалось.

На странице MSDN для этого метода.

http://msdn.microsoft.com/en-us/library/994c0zb1.aspx

Входит ноль, ноль выходит.

Ответ 7

Изменение CultureInfo с TryParse ничего не сделало для меня. Мне пришлось изменить числовые форматы в панели управления (изменения, даты, время или числовые форматы) и изменить символ Десятичный. Чем это сработало снова.

Ответ 8

Самое глупое в этом состоит в том, что он принимает только "," как десятичный разделитель в моей культуре, но результат получается с помощью ".". Кто-то, где-то, не очень повезло, думая в тот день... Поэтому я попробую:

if ((double.TryParse(sVat, out vat)) == false)
    if (double.TryParse(sVat.Replace(",", "."), out vat) == false)
      double.TryParse(sVat.Replace(".", ","), out vat);

Ответ 9

Это работает для меня:

double temp = 0;
Console.WriteLine(double.TryParse("0.0000", out temp));
Console.ReadLine();

пишет True.