C# float.Parse String

61,176

Solution 1

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

Solution 2

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);
}
Share:
61,176
TMachna
Author by

TMachna

Updated on July 09, 2022

Comments

  • TMachna
    TMachna almost 2 years

    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?

  • Edward
    Edward over 7 years
    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
    Edward over 7 years
    sorry this works float[] temp = tempLine.Split().Select(x => float.Parse(x)).ToArray();