Почему я получаю FormatException при преобразовании строки в float?

Когда я пытаюсь преобразовать строку в float:

Console.WriteLine(float.Parse("6.59"));

он выдает исключение:

Необработанное исключение: System.FormatException: строка ввода не была в правильном f Ormat.
   в System.Number.ParseSingle(параметры String, NumberStyles, NumberFormat Info numfmt)

Когда я пробую это так:

Console.WriteLine(Convert.ToSingle("6.59"));

Выдает одно и то же исключение:

Необработанное исключение: System.FormatException: строка ввода не была в правильном f Ormat.
   в System.Number.ParseSingle(параметры String, NumberStyles, NumberFormat Info numfmt)
   в System.Convert.ToSingle(значение строки)

Можете ли вы объяснить, почему это происходит?

Ответ 1

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

Попробуйте использовать инвариантную культуру:

float.Parse("6.59", CultureInfo.InvariantCulture)

Ответ 2

Проблема здесь в вашей культуре.

Либо установите инвариантную культуру следующим образом:

float.Parse("6.59", CultureInfo.InvariantCulture)

или используйте правильный десятичный разделитель для вашей культуры

float.Parse("6,59")

Интересно, почему вы используете буквенную строку. Если у вас возникают проблемы с вводом буквенных поплавков, вы можете использовать

Console.WriteLine(6.59f)

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

Ответ 3

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

Вы можете попробовать "Разбор" с помощью InvariantCulture:

float.Parse("6.59", CultureInfo.InvariantCulture)

Ответ 4

Может быть проблема с Locale/Culture. Для десятичного разделителя вам нужно установить , вместо ..

Ответ 5

Культурные особенности. Какая ваша культура по умолчанию? Некоторые культуры используют "," вместо ".". Вы можете попробовать следующее:

float.Parse("6.59", CultureInfo.InvariantCulture);

Ответ 6

Я знаю, что все здесь уже дали причину проблемы, но, возможно, кто-то должен просто расширить, почему Invariant исправляет ее.

Класс CultureInfo используется прямо или косвенно классами, которые форматируют, анализируют или манипулируют данными, специфичными для культуры, такими как String, DateTime, DateTimeOffset и числовые типы, чтобы иметь дело с различиями в том, как разные культуры пишут эти типы.

В случае десятичного типа некоторые культуры используют период (.), в то время как другие используют запятую (,). По умолчанию, когда вы используете библиотеки конверсий, он будет использовать вашу локальную культуру (то есть страну, на которую настроена ваша ОС).

Указывая Invariant, вы говорите, что вы ожидаете, что тысячи разделителей будут запятыми (,) и десятичным разделителем как период (.), как и в большинстве культур.

Большая проблема, которая иногда случается, заключается в том, что эти культурные соглашения меняются с точки зрения ОС. Например, информация о культуре Южной Африки (З.Ы.) использовалась для того, чтобы вести себя как инвариантная культура. Microsoft изменила это с помощью Windows 8, где десятичная запятая внезапно стала запятой, а тысяча разделителей - пространством. Это привело к тому, что многие устаревшие системы, написанные на .Net, сильно ломались, когда переносили их в более новые операционные системы.

В конце концов, сделка нормализует всю информацию о местной культуре до инварианта и сохраняется и обрабатывает их в вашей бизнес-логике в этом формате. Затем локализуйте его на переднем конце. То же самое касается DateTime, как можно скорее конвертируйте в UTC и только назад, когда вы делаете вывод.

Ответ 7

Вы также можете попробовать преобразовать класс для выполнения этой задачи.

Convert.ToDecimal( "6,59" );