Visual Express 2008 avec le symbole '?'

Résolu
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017 - 26 oct. 2007 à 18:23
dvjh Messages postés 6 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 14 décembre 2008 - 27 oct. 2007 à 23:53
un bout de code en dit parfois plus long :

tring str = "25.5?";
double result = Double.Parse (str);
double result2 = Double.Parse (str, NumberStyles.AllowCurrencySymbol, CultureInfo.CurrentCulture);

dans un cas comme dans l'autre, le Parse génère une exception FormatException (Le format de la chaîne d'entrée est incorrect.)

Est ce un bug, une feature ou un oublie ?

Thx

----------------------------
C++ forever
C# amateur

10 réponses

dvjh Messages postés 6 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 14 décembre 2008
26 oct. 2007 à 22:24
            string str = "25,5";
            double result = Double.Parse(str);
                        this.label1.Text "str " + str + " ; result = " + result;

            CultureInfo myCulture = new CultureInfo("fr-FR", false);
            
            this.label2.Text = "The currency symbol for " + myCulture.DisplayName + " ; is " + myCulture.NumberFormat.CurrencySymbol;
            
            string str1 = "-25,5 ?";
            double result1 = Double.Parse(str1, NumberStyles.Currency, myCulture.NumberFormat);
                        this.label3.Text "str1 " + str1 + " ; result1 = " + result1;
3
cs_niky Messages postés 168 Date d'inscription jeudi 28 juin 2001 Statut Membre Dernière intervention 18 octobre 2008 7
26 oct. 2007 à 18:57
Ca ne marche pas parce que AllowCurrencySymbol semble devoir être combiné avec d'autres flags pour reconnaître un format monétaire.
Ca marche si tu remplaces AllowCurrencySymbol par Currency (qui est une composition de flags d'après la doc).

De plus, chez moi je dois mettre une virgule comme séparateur des décimales.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
26 oct. 2007 à 20:37
Pour le separator, ça dépend de la culture qui est settée dans le thread courant.
Voire http://msdn2.microsoft.com/fr-fr/library/xbtzcc4w(VS.80).aspx

<hr />
-My Blog-
0
dvjh Messages postés 6 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 14 décembre 2008
27 oct. 2007 à 00:26
En fait, c'est assez subtil.

string str1 = "-25.999,5 ?";

est OK pour la culture "fr-BE"

mais pour la culture "fr-FR"

il faut : string str1 = "-25 999,5 ?";
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 oct. 2007 à 00:30
Les cultures étant différentes, la représentation aussi et donc le parsing de la chaîne également, évidemment. C'est plutôt logique non ?

<hr />
-My Blog-
0
scoubidou944 Messages postés 714 Date d'inscription mardi 22 avril 2003 Statut Membre Dernière intervention 19 janvier 2017
27 oct. 2007 à 09:36
Effectivement tout est question de subtilité mais en fait, pourquoi le fait de parcourir un 'double' dans une chaîne qui contient le symbole '?' fait planter ?.

Je vais relire la doc je pense mais en fait le Parse est trop ... pour se rendre compte de la chaîne entrée est légèrement différente.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
27 oct. 2007 à 10:02
xx.xx ? ce n'est pas une double, c'est une valeur monétaire. Par défaut, Parse/TryParse ne s'attends pas à une telle valeur, il paraît donc logique que ça plante !
Maintenant tu peux spécifié que la valeur à parser/convertir est une valeur monétaire, mais il faut également faire attention que la culture du thread courrant soit correct, car la représentation des chaînes varient (separator des millieurs, separator des décimals, etc)

<hr />
-My Blog-
0
dvjh Messages postés 6 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 14 décembre 2008
27 oct. 2007 à 14:49
Part subtile, j'entendais une tâche qui demande des qualités. C'est-à-dire que la boite de dialogue dans laquelle l'utilisateur devra saisir la valeur monétaire demandera plus d'espace pour expliquer que pour saisir, en effet je pense que l'utilisateur lambda n'est pas toujours au fait des normes de sa propre culture. De plus, comme on ignore la culture de l'utilisateur on ne pourra donner comme explication que des exemples dans deux ou trois cultures importantes, mais qui connait les subtilités du chinois ou du russe ?

Et c'est encore plus complexe, en effet on n'est pas obligé de mettre le symbole monétaire, on peut le mettre devant ou derrière le nombre, avec ou sans un espace !

string str1 = "? -25 999,52";
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
27 oct. 2007 à 21:59
Salut,

"De plus, comme on ignore la culture de l'utilisateur on ne pourra donner comme explication que des exemples dans deux ou trois cultures importantes, mais qui connait les subtilités du chinois ou du russe ?"
Pourquoi 2/3 exemples alors qu'on peut toutes les afficher ?
Dans ce genre de cas, je pense que le plus pratique est d'afficher à l'utilisateur la représentation d'un montant dans sa culture (en lui indiquant ou non que le symbole monétaire est facultatif :

Double montant = 123456789.12;
String montantStr = montant.ToString("C", CultureInfo.CurrentCulture);

Avec un exemple aussi concret, il ne peut plus (doit plus) se tromper.

Et sinon méfiez vous des valeurs écrites en litéral pour les tests, elles peuvent être directement responsables de l'échec (ici non, mais je pense à des cas comme l'espace etc).

/*
coq
MVP Visual C#
CoqBlog
*/
0
dvjh Messages postés 6 Date d'inscription vendredi 26 octobre 2007 Statut Membre Dernière intervention 14 décembre 2008
27 oct. 2007 à 23:53
Très bien vu !

On peut s'amuser à listé?

foreach (CultureInfo ci in CultureInfo.GetCultures(CultureTypes.AllCultures))
{
Console.WriteLine(ci.DisplayName + " = " + ci);
}

?et à testé toutes les cultures.

double montant = 123456789.12;

// Ukraine
MessageBox.Show(montant.ToString("C", new CultureInfo("uk-UA", false)));
0
Rejoignez-nous