Почему double.TryParse ("0.0000", out doubleValue) возвращает false? - PullRequest
32 голосов
/ 11 декабря 2011

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

Есть идеи, почему это происходит?

Ответы [ 9 ]

50 голосов
/ 11 декабря 2011

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

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

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

OR

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

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

9 голосов
/ 11 декабря 2011

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 голосов
/ 11 декабря 2011

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

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

style = NumberStyles.Float | NumberStyles.AllowThousands;
culture = CultureInfo.InvariantCulture;
float num;
if (double.TryParse("0.0000", style, culture, out num)) {
    // whatever
}
2 голосов
/ 11 декабря 2011

Будет возвращено 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 это может отличаться.

1 голос
/ 28 сентября 2012

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

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

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

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

1 голос
/ 11 декабря 2011

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

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
0 голосов
/ 13 сентября 2017

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

if ((double.TryParse(sVat, out vat)) == false)
    if (double.TryParse(sVat.Replace(",", "."), out vat) == false)
      double.TryParse(sVat.Replace(".", ","), out vat);
0 голосов
/ 06 октября 2015

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

0 голосов
/ 11 декабря 2011

у меня работает:

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

пишет True.

...