Float.Parse() не работает так, как я хотел

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

        var s = "0.0";
        var f = float.Parse(s);

Приведенный выше код выдает исключение в строке 2 "Строка ввода не была в правильном формате".

Я считаю, что решение было бы передовыми перегрузками float.Parse, которые включают в себя параметр IFormatProvider как параметр, но я пока ничего не знаю об этом.

Как разобрать "0.0"?

Ответ 1

Точечный символ "." не используется в качестве разделителя (это зависит от настроек Culture). Поэтому, если вы хотите быть абсолютно уверены, что точка правильно проанализирована, вам нужно написать что-то вроде этого:

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone();
ci.NumberFormat.CurrencyDecimalSeparator = ".";
avarage = double.Parse("0.0",NumberStyles.Any,ci);

Ответ 2

Сначала вы можете проверить нулевую или пустую строку.

Вы также можете использовать одну из перегрузок Parse (или даже использовать TryParse), чтобы дать более конкретный контроль.

например. для проверки с использованием инвариантной культуры, чтобы избежать вариаций разделительных знаков с невидимыми видимыми данными (например, из сообщений A2A):

float SafeParse(string input) {
  if (String.IsNullOrEmpty(input)) { throw new ArgumentNullException("input"); }

  float res;
  if (Single.TryParse(input, NumberStyles.Float, CultureInfo.InvariantCulture, out res)) {
    return res;
  }

  return 0.0f; // Or perhaps throw your own exception type
}

Ответ 3

Следующие работы для меня:

string stringVal = "0.0";
float floatVal = float.Parse(stringVal , CultureInfo.InvariantCulture.NumberFormat);

Обратный регистр (работает для всех coutries):

float floatVal = 0.0f;
string stringVal = floatVal.ToString("F1", new CultureInfo("en-US").NumberFormat);

Ответ 4

Я только что попробовал это, и он не исключил никаких исключений.

Является ли ваш формат чисел десятичной запятой, а не десятичной точкой? Вы пробовали:

var s = "0,0";
var f = float.Parse(s);

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

Ответ 5

Или вы могли бы просто проверить, не является ли входной текст нулевым или пустым.

Кроме того, будьте осторожны, потому что в некоторых странах "." (точка), которая разделяет числа с плавающей точкой, является "," (запятая)