Вопрос по c# – float.Parse () не работает так, как я хотел

12

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

<code>        var s = "0.0";
        var f = float.Parse(s);
</code>

Приведенный выше код вызывает исключение в строке 2 & quot; Входная строка была неверного формата. & Quot;

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

Как мне разобрать & quot; 0.0 & quot ;?

Я опробовал ваш код и смог разобрать значение штрафа. Gavin Miller
Этот код зависит от культуры (то есть зависит от локали). Поэтому некоторые из нас не увидят такого поведения. inazaruk

Ваш Ответ

5   ответов
7

Вы также можете использовать одну из перегрузок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
}
2

не является ли введенный текст нулевым или пустым.

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

На самом деле, это точка, и она не работает. Когда я изменил ее на запятую, это сработало. Возможно, мне придется изменить весь файл. Ivan Prodanov
5

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

Обратный случай (работает для всех стран):

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

и он не выдавал никаких исключений вообще.

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

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

Having asked this I've just tried it with the comma expecting to get an exception, but didn't. So this might not be the answer.

@Akku - я не помню точный тест, который я сделал (я опубликовал этот ответ 2 с половиной года назад), но я знаю о локалях и о том, как они влияют на анализ чисел. Я предлагал пользователю, чтоhis locale был установлен на тот, который ожидал десятичные запятые, а не десятичные точки.
Исключение может быть получено с правильным языком, например, английским.
этоnew question может объяснить, почему я получил результат, а не исключение.
24

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

CultureInfo ci = (CultureInfo)CultureInfo.CurrentCulture.Clone();
ci.NumberFormat.CurrencyDecimalSeparator = ".";
avarage = double.Parse("0.0",NumberStyles.Any,ci);
CultureInfo.InvariantCulture лучше. (увидеть ниже)
Мне очень жаль за поздний ответ (я принял ваш ответ сейчас), но я был занят. Спасибо за ваш ответ, он делает то, что мне было нужно. Я действительно ценю это. Ivan Prodanov

Похожие вопросы