Подтвердить что ты не робот

С# float.Parse String

Я новичок в С# и мне нужно прочитать float значения (x, y, z) из файла. Это выглядит так:

0 -0.01 -0.002

0.000833333333333 -0.01 -0.002

Если я пытаюсь

float number = float.Parse("0,54"); // it works well, but
float number = float.Parse("0.54"); // gains exepction.

Мой код для чтения значений из каждой строки (может быть ошибка):

int begin = 0;
int end = 0;
for (int i = 0; i < tempLine.Length; i++)
{
    if (Char.IsWhiteSpace(tempLine.ElementAt(i)))
    {
        end = i;
        float value = float.Parse(tempLine.Substring(begin, end));
        begin = end;
        System.Console.WriteLine(value);
    }
}

Кто-то может помочь?

4b9b3361

Ответ 1

float.Parse(string) метод использует ваши текущие настройки культуры по умолчанию. Похоже, что CurrentCulture NumberDecimalSeparator свойство , not .

Вот почему вы получаете FormatException в своем примере "0.54".

В качестве решения вы можете использовать культуру . как NumberDecimalSeparator как InvariantCulture как второй параметр в методе Parse или вы можете .Clone() ваш CurrentCulture и установить для него свойство NumberDecimalSeparator на .

float number = float.Parse("0.54", CultureInfo.InvariantCulture);

или

var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = ".";
float number = float.Parse("0.54", culture);

Ответ 2

Кажется, ваша культура использует comma как десятичный разделитель. Попробуйте разобрать его с помощью InvariantCulture

var value = float.Parse(tempLine.Substring(begin, end), CultureInfo.InvariantCulture);

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

foreach(var str in tempLine.Split())  
{
    float value = float.Parse(str, CultureInfo.InvariantCulture);
}