Problème IDIOT de conversion string->float [RESOLU]

Problème IDIOT de conversion string->float [RESOLU] - C#/.NET managed - Programmation

Marsh Posté le 12-02-2007 à 17:33:08    

Bonjour,
 
J'essaie désespérément de convertir une chaine de caractère vers un float mais quel que soit la fonction ou/et les paramètres utilisés, j'aboutis toujours à une exception!
 
Le code que j'essaie, le plus bidon du monde:
 

Code :
  1. try
  2.   {
  3.   float test = 0;
  4.   Single.TryParse ( "12.6", out test );
  5.   }
  6. catch ( Exception )
  7.   {
  8.    ...
  9.   }


 
Hé bien non, après le passage par le TryParse test vaut toujours 0 et une exception est lancée!  :fou:  
 
Qu'est-ce qui ne va pas d'après vous?


Message édité par akalash47 le 13-02-2007 à 21:15:28
Reply

Marsh Posté le 12-02-2007 à 17:33:08   

Reply

Marsh Posté le 12-02-2007 à 17:36:44    

Ah oui, et le plus drôle...Maintenant si je déclare test avant le try comme ceci:
 

Code :
  1. float test = 0;
  2. try
  3.   {
  4.   Single.TryParse ( "12.6", out test );
  5.   }
  6. catch ( Exception )
  7.   {
  8.    ...
  9.   }


 
test vaut toujours 0 au final mais aucune exception n'est lancée  :pt1cable:

Reply

Marsh Posté le 12-02-2007 à 17:46:43    

akalash47 a écrit :

Ah oui, et le plus drôle...Maintenant si je déclare test avant le try comme ceci:
 

Code :
  1. float test = 0;
  2. try
  3.   {
  4.   Single.TryParse ( "12.6", out test );
  5.   }
  6. catch ( Exception )
  7.   {
  8.    ...
  9.   }


 
test vaut toujours 0 au final mais aucune exception n'est lancée  :pt1cable:


 
La je ne saurais te dire pourquoi. Par contre, le string en entrée de tryparse dépends de la culture courante, c.a.d. ile te faut mettre "12,6" dans ton cas. une surchage existe permettant de spécifier une culture différente

Reply

Marsh Posté le 12-02-2007 à 17:49:31    

Okéééé. C'est bon à savoir. Merci d'avoir répondu si vite :)

Reply

Marsh Posté le 12-02-2007 à 20:52:03    

D'une manière générale, lors de conversion il vaut toujours mieux préciser un IFormatProvider, même si c'est pour mettre System.Globalization.CultureInfo.InvariantCulture.
 
Cela optimise le code MSIL, dixit FxCop (outil MS d'analyse de code). De plus, un TryParse correctement utilisé dispense d'un bloc try catch justement :)
 
Essaie
 

Code :
  1. float test;
  2. Single.TryParse("12.6", System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.CultureInfo.InvariantCulture, out test);


 
edit : et d'ailleurs TryParse renvoie un booléen pour savoir si la conversion a réussi/est possible

Message cité 2 fois
Message édité par pikti le 12-02-2007 à 21:00:45
Reply

Marsh Posté le 13-02-2007 à 15:13:57    

Ouais c'est plus propre effectivement, mais ça ne marche pas bien. Curieux.
 
Donc je me suis débrouillé autrement:
 

Code :
  1. string value = "12.6";
  2. CultureInfo currentCulture = System.Threading.Thread.CurrentThread.CurrentCulture;
  3. System.Threading.Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US" );
  4. float fValue = Single.Parse ( value );
  5. System.Threading.Thread.CurrentThread.CurrentCulture = currentCulture;


 
Peut-être moins optimisé, mais au moins ça fonctionne ^^

Message cité 1 fois
Message édité par akalash47 le 13-02-2007 à 15:17:03
Reply

Marsh Posté le 13-02-2007 à 15:51:45    

En effet, c'est un tant soit peu... Bourrin  [:mlc2]

Reply

Marsh Posté le 13-02-2007 à 16:37:05    

tout ca pour convertir une string vers un float????  [:rofl]  
 
c'est beau le .NET heuresement que tout ne fonctionne pas la dessus sinon on est tous bon pour  s'acheter des core2duo.........
 

Reply

Marsh Posté le 13-02-2007 à 16:41:23    

red faction a écrit :

tout ca pour convertir une string vers un float????  [:rofl]

 

c'est beau le .NET heuresement que tout ne fonctionne pas la dessus sinon on est tous bon pour  s'acheter des core2duo.........


ça n'est absolument pas lié à .Net. Même si .Net n'a pas de support pour une locale par fonction ou des contextes de locale, il y a ce qu'il faut pour travailler. Et la locale est par thread ce qui est très bien puisque ça veut dire que tu ne perturbes que toi.

 

Si tu étais en C, tu n'aurais pas pu résoudre ce problème autrement quand ayant une fonction différente de lecture qui ignore la locale. C'est d'ailleurs ce que fait glib avec son g_ascii_strtod par exemple.

 

C'est un problème très courant.


Message édité par Taz le 13-02-2007 à 16:48:02
Reply

Marsh Posté le 13-02-2007 à 16:44:47    

red faction a écrit :

tout ca pour convertir une string vers un float????  [:rofl]  
 
c'est beau le .NET heuresement que tout ne fonctionne pas la dessus sinon on est tous bon pour  s'acheter des core2duo.........


 
T'y connais rien hein ?  [:kilgoreweb]  

Reply

Marsh Posté le 13-02-2007 à 16:44:47   

Reply

Marsh Posté le 13-02-2007 à 17:44:07    

ok ca va javais pas vu que cetait un probleme de parametres regionaux........
 
bon je vous laisse les WardlordZ de la programmation , apres tout moi je n'ais pas fait bac+15 comme vous...

Reply

Marsh Posté le 13-02-2007 à 18:04:41    

Un peu cavalier comme sortie, mais ça ira pour cette fois :o

Reply

Marsh Posté le 13-02-2007 à 20:16:50    

akalash47 a écrit :

Ouais c'est plus propre effectivement, mais ça ne marche pas bien. Curieux.
 


 
Très  :o  
 
Au pire tu pouvais passer directement new CultureInfo("en-US" ) plutôt que de changer la culture du Thread (ce qui n'est d'ailleurs pas toujours possible par défaut suivant le type d'application sans les attributs de classe qui vont bien) et de ne pas préciser de IFormatProvider  :p  

Reply

Marsh Posté le 13-02-2007 à 20:28:07    

akalash47 a écrit :

Ah oui, et le plus drôle...Maintenant si je déclare test avant le try comme ceci:
 

Code :
  1. float test = 0;
  2. try
  3.   {
  4.   Single.TryParse ( "12.6", out test );
  5.   }
  6. catch ( Exception )
  7.   {
  8.    ...
  9.   }


 
test vaut toujours 0 au final mais aucune exception n'est lancée  :pt1cable:


 
ce qui est drole c'est que tryparse ne s'utilise pas du tout comme ca... msdn toossa...

Reply

Marsh Posté le 13-02-2007 à 20:28:40    

pikti a écrit :


edit : et d'ailleurs TryParse renvoie un booléen pour savoir si la conversion a réussi/est possible


 
oh tu vas rire, c'est meme a ca que ca sert !

Reply

Marsh Posté le 13-02-2007 à 20:30:52    

pikti a écrit :

Très  :o  
 
Au pire tu pouvais passer directement new CultureInfo("en-US" ) plutôt que de changer la culture du Thread (ce qui n'est d'ailleurs pas toujours possible par défaut suivant le type d'application sans les attributs de classe qui vont bien) et de ne pas préciser de IFormatProvider  :p


 
Indice : msdn DecimalSeparator

Reply

Marsh Posté le 13-02-2007 à 20:42:47    

Edit: J'y comprends rien! J'ai redémarré l'ordinateur, recompilé la solution sans rien changer...et bien le code "float value = Single.Parse ( textBoxControl.Text, new CultureInfo("en-US" ) );" marche maintenant!
 
Un peu bizarre cette histoire  :heink:


Message édité par akalash47 le 13-02-2007 à 21:03:42
Reply

Marsh Posté le 13-02-2007 à 21:25:52    

Tamahome a écrit :

Indice : msdn DecimalSeparator


 
AllowDecimalPoint  :D  
 

pikti a écrit :


Code :
  1. float test;
  2. Single.TryParse("12.6", System.Globalization.NumberStyles.AllowDecimalPoint, System.Globalization.CultureInfo.InvariantCulture, out test);




 
 

Reply

Marsh Posté le 13-02-2007 à 23:00:08    

euh je pensais pas a ca, mais bon...
 
Et surtout tester la valeur de retour du TryParse, c'est comment dire, obligatoire :o

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed