21

I'm new in C# and need to read float values (x, y, z) from file. It looks like:

0 -0.01 -0.002

0.000833333333333 -0.01 -0.002

If Iam trying

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

My code for reading values from each line (could be bugged):

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);
    }
}

Someone could help?

Community
  • 1
  • 1
TMachna
  • 279
  • 1
  • 2
  • 10

2 Answers2

42

float.Parse(string) method uses your current culture settings by default. Looks like your CurrentCulture's NumberDecimalSeparator property is , not .

That's why you get FormatException in your "0.54" example.

As a solution, you can use a culture have . as a NumberDecimalSeparator like InvariantCulture as a second parameter in Parse method, or you can .Clone() your CurrentCulture and set it's NumberDecimalSeparator property to .

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

or

var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = ".";
float number = float.Parse("0.54", culture);
Soner Gönül
  • 97,193
  • 102
  • 206
  • 364
8

It seems your culture uses comma as the decimal separator. Try parsing it with InvariantCulture

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

In addition to this, the way you parsing the lines is more complicated than it should. You can just split the line instead of trying to deal with indices:

foreach(var str in tempLine.Split())  
{
    float value = float.Parse(str, CultureInfo.InvariantCulture);
}
Selman Genç
  • 100,147
  • 13
  • 119
  • 184
  • Ah I was going to suggest the Split but was think more of a float[] as the output so no need for any loops. `float[] temp = float.Parse(tempLine.Split() );` – Edward Aug 31 '16 at 04:35
  • sorry this works `float[] temp = tempLine.Split().Select(x => float.Parse(x)).ToArray();` – Edward Aug 31 '16 at 04:42