Синтаксический анализ «1.5» с помощью AllowDecimalPoint дает FormatException

#c# #parsing #.net-core #double #c#-interactive

#c# #синтаксический анализ #.net-ядро #двойной #c # -интерактивный

Вопрос:

Когда я пытаюсь запустить этот код с помощью интерактивного компилятора C #

 double.Parse("1.5", System.Globalization.NumberStyles.AllowDecimalPoint);
  

У меня есть это исключение

 System.FormatException: Input string was not in a correct format.
    System.Number.ParseDouble(string, System.Globalization.NumberStyles, System.Globalization.NumberFormatInfo)
    double.Parse(string, System.Globalization.NumberStyles)
    <Initialize>.MoveNext()
  

Я прочитал это из документации, но я не стал от этого мудрее.

Указывает, что числовая строка может иметь десятичную точку. Если NumberStyles значение включает AllowCurrencySymbol флаг, а анализируемая строка содержит символ валюты, символ десятичного разделителя определяется CurrencyDecimalSeparator свойством. В противном случае символ десятичного разделителя определяется NumberDecimalSeparator свойством.

Также приведенный ниже код выдает мне ту же ошибку:

 double.Parse("1.500", System.Globalization.NumberStyles.AllowDecimalPoint);
  

Почему у меня эта ошибка? Я ожидал, что он даст мне 1.5 как двойное, потому что разрешена десятичная точка.

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

 double.Parse("1,5", System.Globalization.NumberStyles.AllowDecimalPoint);
  

Комментарии:

1. Разве вы не ответили на свой собственный вопрос в примечании? десятичная точка фактически означает десятичный разделитель, который в вашей текущей культуре является запятой. Вы должны использовать double.Parse("1.5", System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture); , например.

Ответ №1:

Добавьте третий параметр к вызову

 double.Parse("1.5", System.Globalization.NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture);
  

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