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

J’essaie d’parsingr la chaîne ” double.TryParse() ” 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 est correctement analysé à la valeur 5.

Des idées pourquoi ça se passe?

il prend en compte les parameters 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 , au lieu de …

Dans votre cas spécifique, je suppose que vous souhaitez une culture fixe, quel que soit le système sur lequel vous vous exécutez . comme point décimal:

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

OU

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

Quelques liens de référence MSDN:

  • Double.TryParse (Ssortingng, NumberStyles, IFormatProvider, Double)
  • CultureInfo.CreateSpecificCulture (Ssortingng)
  • Interface IFormatProvider
  • Propriété CultureInfo.InvariantCulture

TryParse utilise la culture actuelle par défaut. Et si votre culture actuelle utilise un séparateur décimal différent de . , il ne peut pas parsingr 0.0000 comme vous le souhaitez. Vous devez donc 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) 

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

Il renverra false si la culture actuelle spécifie un séparateur de point décimal différent de celui . personnage.

Lors de l’parsing 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 une 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 . Le caractère est utilisé en tant que NumberGroupSeparator et le caractère , tant que NumberDecimalSeparator .

Si l’entrée que vous parsingz provient de l’utilisateur, parsingz-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 sur le thread d’interface utilisateur pour l’obtenir. Dans une application ASP.NET, cela peut être différent.

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

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

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

À partir de la page MSDN pour cette méthode.

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

Zéro entre, zéro sort.

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é.

La chose la plus stupide à ce sujet est qu’elle accepte uniquement “,” en tant que séparateur décimal dans ma culture, mais le résultat est un “.”. Quelqu’un, quelque part, n’a pas eu beaucoup de chance de penser ce jour-là … Je vais donc essayer ceci:

 if ((double.TryParse(sVat, out vat)) == false) if (double.TryParse(sVat.Replace(",", "."), out vat) == false) double.TryParse(sVat.Replace(".", ","), out vat); 

Ça marche pour moi:

 double temp = 0; Console.WriteLine(double.TryParse("0.0000", out temp)); Console.ReadLine(); 

écrit True .