web-dev-qa-db-fra.com

Pourquoi double.TryParse ("0.0000", out doubleValue) renvoie false?

J'essaye d'analyser la chaîne "0.0000" avec double.TryParse() mais je ne sais pas pourquoi elle renverrait false dans cet exemple particulier Lorsque je passe des chaînes de type entier, par exemple "5" il analyse correctement à la valeur de 5.

Des idées pourquoi ça se passe? 

32
Patryk

il prend en compte les paramètres de localisation au moment de l'exécution ... peut-être que vous l'exécutez sur un système où . n'est pas le point décimal, mais plutôt , ...

Dans votre cas particulier, je suppose que vous voulez une culture fixe, quel que soit le système sur lequel vous travaillez, avec . comme point décimal:

double.TryParse("0.0000", NumberStyles.Number, CultureInfo.CreateSpecificCulture ("en-US"), out temp)

OR

double.TryParse("0.0000", NumberStyles.Number,CultureInfo.InvariantCulture, out temp)

Quelques liens de référence MSDN:

48
Yahia

TryParse utilise la culture actuelle par défaut. Et si votre culture actuelle utilise un séparateur décimal différent de ., elle ne peut pas analyser 0.0000 comme vous le souhaitez. Donc, vous devez passer CultureInfo.InvariantCulture

var numberStyle = NumberStyles.AllowLeadingWhite |
                 NumberStyles.AllowTrailingWhite |
                 NumberStyles.AllowLeadingSign |
                 NumberStyles.AllowDecimalPoint |
                 NumberStyles.AllowThousands |
                 NumberStyles.AllowExponent;//Choose what you need
double.TryParse( "0.0000", numberStyle, CultureInfo.InvariantCulture, out myVar)
9
CodesInChaos

Le problème est presque certainement que Thread.CurrentCulture n'utilise pas point comme séparateur décimal.

Si vous savez que le nombre sera toujours mis en forme avec un point comme séparateur décimal, utilisez ce code qui utilise l'autre surcharge de double.TryParse:

style = NumberStyles.Float | NumberStyles.AllowThousands;
culture = CultureInfo.InvariantCulture;
float num;
if (double.TryParse("0.0000", style, culture, out num)) {
    // whatever
}
3
Jon

Il renverra false si la culture actuelle spécifie un séparateur de point décimal différent du caractère ..

Lors de l'analyse de la représentation des chaînes, vous devez savoir dans quelle culture elles sont représentées, sinon vous obtiendrez un comportement inattendu.

Dans ce cas, vous obtenez false, mais cela pourrait même être pire, par exemple, dans l'exemple suivant, si vous vous attendiez à obtenir le numéro un, vous obtiendrez plutôt un millier:

Thread.CurrentThread.CurrentCulture = new CultureInfo("pt-PT");

double d;
Console.WriteLine(double.TryParse("1.000", out d));
Console.WriteLine(d);

En effet, dans la culture pt-PT, le caractère . est utilisé en tant que NumberGroupSeparator et le caractère , en tant que NumberDecimalSeparator

Si l'entrée que vous analysez provient de l'utilisateur, analysez-la toujours à l'aide de la culture à laquelle l'utilisateur est associé. Obtenir la culture à laquelle l'utilisateur est associé est quelque chose qui dépend du contexte. Par exemple, dans une application Windows Forms, vous utiliseriez Thread.CurrentThread.CurrentCulture dans le thread de l'interface utilisateur pour l'obtenir. Dans une application ASP.NET, cela peut être différent.

2
João Angelo

Pour changer la culture en quelque chose qui a "." comme séparateur décimal, utilisez:

Thread.CurrentThread.CurrentCulture = new CultureInfo("en-GB");
1
Tudor

Lorsque cette méthode retourne, contient la virgule flottante double précision nombre équivalent au paramètre s, si la conversion a réussi, ou zéro si la conversion a échoué.

De la page MSDN pour cette méthode.

http://msdn.Microsoft.com/en-us/library/994c0zb1.aspx

Zéro entre, zéro sort. 

1
Kill Joy

Changer de CultureInfo avec TryParse ne m'a rien apporté. J'ai dû modifier les formats numériques sous Panneau de configuration (formats de modification, de date, d'heure ou de nombre) et modifié le symbole décimal. Alors cela a encore fonctionné.

0
Cerveser