Почему double.TryParse( "0.0000", out doubleValue) возвращает false?
Я пытаюсь проанализировать строку "0.0000" с помощью double.TryParse()
, но я не знаю, почему она вернет false в этом конкретном примере. Когда я передаю целые строки, например. "5" правильно анализирует значение 5.
Любые идеи, почему это происходит?
Ответы
Ответ 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
.