Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2241 connectés 

  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 



 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1513749
akalash47
Posté le 12-02-2007 à 17:33:08  profilanswer
 

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
mood
Publicité
Posté le 12-02-2007 à 17:33:08  profilanswer
 

n°1513754
akalash47
Posté le 12-02-2007 à 17:36:44  profilanswer
 

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:

n°1513764
ixemul
Nan mais sans blague ! ⚡
Posté le 12-02-2007 à 17:46:43  profilanswer
 

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

n°1513768
akalash47
Posté le 12-02-2007 à 17:49:31  profilanswer
 

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

n°1513850
pikti
I’ve done worse
Posté le 12-02-2007 à 20:52:03  profilanswer
 

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
n°1514117
akalash47
Posté le 13-02-2007 à 15:13:57  profilanswer
 

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
n°1514145
ixemul
Nan mais sans blague ! ⚡
Posté le 13-02-2007 à 15:51:45  profilanswer
 

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

n°1514167
red factio​n
Posté le 13-02-2007 à 16:37:05  profilanswer
 

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

n°1514172
Taz
bisounours-codeur
Posté le 13-02-2007 à 16:41:23  profilanswer
 

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
n°1514175
ixemul
Nan mais sans blague ! ⚡
Posté le 13-02-2007 à 16:44:47  profilanswer
 

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]  

mood
Publicité
Posté le 13-02-2007 à 16:44:47  profilanswer
 

n°1514195
red factio​n
Posté le 13-02-2007 à 17:44:07  profilanswer
 

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

n°1514205
ixemul
Nan mais sans blague ! ⚡
Posté le 13-02-2007 à 18:04:41  profilanswer
 

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

n°1514257
pikti
I’ve done worse
Posté le 13-02-2007 à 20:16:50  profilanswer
 

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  

n°1514262
Tamahome
⭐⭐⭐⭐⭐
Posté le 13-02-2007 à 20:28:07  profilanswer
 

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

n°1514263
Tamahome
⭐⭐⭐⭐⭐
Posté le 13-02-2007 à 20:28:40  profilanswer
 

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 !

n°1514264
Tamahome
⭐⭐⭐⭐⭐
Posté le 13-02-2007 à 20:30:52  profilanswer
 

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

n°1514269
akalash47
Posté le 13-02-2007 à 20:42:47  profilanswer
 

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
n°1514282
pikti
I’ve done worse
Posté le 13-02-2007 à 21:25:52  profilanswer
 

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);




 
 

n°1514325
Tamahome
⭐⭐⭐⭐⭐
Posté le 13-02-2007 à 23:00:08  profilanswer
 

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


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C#/.NET managed

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

 

Sujets relatifs
[VB.Net] Problème de répertoires de travail[Code inside] Conversion entre UTF-8 et ANSI (utf8 ansi transact sql)
[VBA] [résolu] Excel - bug sur macro toute simple[PHP] Probleme requette sql
[Résolu][VS6] WinXP=>Win2k: "This program cannot be run in DOS Mode"[RESOLU] interdir le download de fichier
Problème sur une requête (ifnull ?)Probleme fichier cpuinf32.dll
probleme requete MATCH mysql_fetch_???problème de table
Plus de sujets relatifs à : Problème IDIOT de conversion string->float [RESOLU]


Copyright © 1997-2018 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR