285 votes

Comment analyser une chaîne de caractères avec un point décimal en un double ?

Je veux analyser une chaîne de caractères comme "3.5" à un double. Cependant,

double.Parse("3.5") 

donne 35 et

double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint) 

lance un FormatException .

Or, la locale de mon ordinateur est réglée sur l'allemand, où une virgule est utilisée comme séparateur décimal. Il se peut qu'il y ait un rapport avec cela et double.Parse() en attendant "3,5" comme entrée, mais je ne suis pas sûr.

Comment puis-je analyser une chaîne contenant un nombre décimal qui peut ou non être formaté comme spécifié dans ma locale actuelle ?

516voto

Mehrdad Afshari Points 204872
double.Parse("3.5", CultureInfo.InvariantCulture)

87voto

J'utilise habituellement une fonction multiculturelle pour analyser les entrées utilisateur, principalement parce que si quelqu'un est habitué au pavé numérique et utilise une culture qui utilise la virgule comme séparateur décimal, cette personne utilisera la pointe du pavé numérique au lieu de la virgule.

public static double GetDouble(string value, double defaultValue)
{
    double result;

    //Try parsing in the current culture
    if (!double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.CurrentCulture, out result) &&
        //Then try in US english
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.GetCultureInfo("en-US"), out result) &&
        //Then in neutral language
        !double.TryParse(value, System.Globalization.NumberStyles.Any, CultureInfo.InvariantCulture, out result))
    {
        result = defaultValue;
    }

    return result;
}

Attention cependant, les commentaires de @nikie sont vrais. Pour ma défense, j'utilise cette fonction dans un environnement contrôlé où je sais que la culture peut être soit en-US, en-CA ou fr-CA. J'utilise cette fonction parce qu'en français, nous utilisons la virgule comme séparateur décimal, mais quiconque a déjà travaillé dans la finance utilisera toujours le séparateur décimal sur le pavé numérique, mais il s'agit d'un point, pas d'une virgule. Donc, même dans la culture fr-CA, j'ai besoin d'analyser des nombres qui auront un point comme séparateur décimal.

26voto

Baluda Points 49
Double.Parse("3,5".Replace(',', '.'), CultureInfo.InvariantCulture)

Remplacer la virgule par un point avant l'analyse syntaxique. Utile dans les pays où la virgule est utilisée comme séparateur décimal. Pensez à limiter la saisie de l'utilisateur (si nécessaire) à une virgule ou un point.

15voto

Yakeen Points 997

L'astuce consiste à utiliser la culture invariante, pour analyser le point dans toutes les cultures.

double.Parse("3.5", System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.NumberFormatInfo.InvariantInfo);

3voto

Martin Points 37
string testString1 = "2,457";
string testString2 = "2.457";    
double testNum = 0.5;
char decimalSepparator;
decimalSepparator = testNum.ToString()[1];

Console.WriteLine(double.Parse(testString1.Replace('.', decimalSepparator).Replace(',', decimalSepparator)));
Console.WriteLine(double.Parse(testString2.Replace('.', decimalSepparator).Replace(',', decimalSepparator)));

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X