C# float.Parse String

2019-06-15 07:53发布

问题:

Iam 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 ?

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


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