web-dev-qa-db-fra.com

C # float.Parse String

Je suis nouveau en C # et j'ai besoin de lire float valeurs (x, y, z) du fichier. On dirait:

0 -0,01 -0,002

0,000833333333333 -0,01 -0,002

Si j'essaye

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

Mon code pour lire les valeurs de chaque ligne (peut être buggé):

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

Quelqu'un pourrait aider?

13
Shelboy

méthode float.Parse(string) utilise vos paramètres de culture actuels par défaut. On dirait que votre CurrentCulture est NumberDecimalSeparator propriété est , Pas .

C'est pourquoi vous obtenez FormatException dans votre exemple "0.54".

Comme solution, vous pouvez utiliser une culture ayant . Comme NumberDecimalSeparator comme InvariantCulture comme deuxième paramètre dans la méthode Parse , ou vous pouvez .Clone() votre CurrentCulture et définissez sa propriété NumberDecimalSeparator sur .

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

ou

var culture = (CultureInfo)CultureInfo.CurrentCulture.Clone();
culture.NumberFormat.NumberDecimalSeparator = ".";
float number = float.Parse("0.54", culture);
22
Soner Gönül

Il semble que votre culture utilise comma comme séparateur décimal. Essayez de l'analyser avec InvariantCulture

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

En plus de cela, la façon dont vous analysez les lignes est plus compliquée qu'elle ne devrait. Vous pouvez simplement diviser la ligne au lieu d'essayer de gérer les indices:

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