Convertion String -> Double impossible

Tomtete Messages postés 8 Date d'inscription vendredi 4 mai 2012 Statut Membre Dernière intervention 4 mai 2012 - 4 mai 2012 à 10:38
Tomtete Messages postés 8 Date d'inscription vendredi 4 mai 2012 Statut Membre Dernière intervention 4 mai 2012 - 4 mai 2012 à 12:19
Bonjour à tous,

C'est mon premier post sur le forum donc je ne sais pas trop comment m'y prendre.

Alors je rentrerai directement dans le vif du sujet.

Je dois convertir un string représentant un grand nombre de type Double mais après de nombreux tests je n'y arrive toujours pas !

Voici quelques ligne de code pour vous illustrez mon problème :

                    processDate = managedObject["CreationDate"].ToString();
//sachant que processDate vaut "20120504091204,078125+120"
                    processDate = processDate.Replace('.', ',');
                    ok = Double.TryParse(processDate,NumberStyles.AllowExponent, CultureInfo.CurrentCulture.NumberFormat , out dateproc);


la valeur de ok est égale a false.

Merci d'avance, si vous voulez plus de précision n'hésitez pas ! ;)
A voir également:

10 réponses

Tomtete Messages postés 8 Date d'inscription vendredi 4 mai 2012 Statut Membre Dernière intervention 4 mai 2012 1
4 mai 2012 à 12:19
Oui en effet le code fonctionne, c'était le fait d'utiliser le IProviderFormat et le Numberstyle apparemment...

Merci a tous pour votre aide, à bientôt.

Voila le code finale :

                    processDate = managedObject["CreationDate"].ToString();
                    processDate = processDate.Replace('.', ',');
                    processDate = processDate.Replace("+", "E+");

                    ok = Double.TryParse(processDate, out dateproc);
1
cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre Dernière intervention 11 juin 2013 7
4 mai 2012 à 10:47
Bonjour,

Je pense que le problème vient du format de ta string. Le replace ne sert a rien si tu n'as pas de '.' dans ta chaîne et je pense que l'erreur vient du '+' qui n'est pas géré par le double.TryParse(). Essaie de faire un replace('+','') pour voir si cela fonctionne.
0
Tomtete Messages postés 8 Date d'inscription vendredi 4 mai 2012 Statut Membre Dernière intervention 4 mai 2012 1
4 mai 2012 à 10:51
Oups, autant pour moi le string de base est "20120504091204.078125+120".

Et le '+' représente l'exposant du nombre donc je ne peux pas le remplacer par '' mais effectivement je suis pratique sûr que le problème vient de là.

Merci pour la rapidité de ta réponse ! :)
0
cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre Dernière intervention 11 juin 2013 7
4 mai 2012 à 10:58
Ok pour le point .
Est ce que tu pourrais faire quelque chose comme ca:
processDate1 = processDate.Substring(0, processDate.indexOf('+'));
processDate2 = processDate.Substring(processDate.indexOf('+')+1);
et ensuite les convertir séparément en double?
Il ne reste plus qu'à les ré assembler comme tu souhaites.
0

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

Posez votre question
Tomtete Messages postés 8 Date d'inscription vendredi 4 mai 2012 Statut Membre Dernière intervention 4 mai 2012 1
4 mai 2012 à 11:04
Le problème est que je dois garder l'exposant du nombre, donc je ne peux pas concaténer les deux (si c'est ce que tu entendais par "ré assembler") par contre je vais essayer de les séparer pour ensuite faire processDate1 exposant processDate2.

Merci pour ton aide, je test et je te donne le résultat.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
4 mai 2012 à 11:25
Salut,

fais un simple replace de ton "+" par un "E+".
En effet le parse s'attend à "E+" pour indiquer l'exposant et pas juste "+".

Plus d'information sur cette fiche MSDN.
0
cs_L0ci Messages postés 224 Date d'inscription vendredi 26 novembre 2010 Statut Membre Dernière intervention 11 juin 2013 7
4 mai 2012 à 11:40
Effectivement bien vu. Bien plus propre comme méthode. Par contre il faut remplacer par "E+" ou par "e"?
0
Tomtete Messages postés 8 Date d'inscription vendredi 4 mai 2012 Statut Membre Dernière intervention 4 mai 2012 1
4 mai 2012 à 11:44
J'ai tester la technique LOci :

String pdNumber = processDate.Substring(0, processDate.IndexOf('+'));
                    String pdExponent = processDate.Substring(processDate.IndexOf('+')+1);

                    Double number = Double.Parse(pdNumber);
                    Double exponent = Double.Parse(pdExponent);
                    dateproc = Math.Pow(number , exponent);

                    ok = Double.TryParse(processDate,NumberStyles.AllowExponent, CultureInfo.CurrentCulture.NumberFormat , out dateproc);


mais dateproc qui est un Double retourne 0 alors que mes deux double son bien les 2 parties voulues.

Et dans la foulée j'ai testé celle de jopop :
processDate = managedObject["CreationDate"].ToString();
                    processDate = processDate.Replace('.', ',');
                    processDate = processDate.Replace("+","E+");
                    ok = Double.TryParse(processDate,NumberStyles.AllowExponent, CultureInfo.CurrentCulture.NumberFormat , out dateproc);


mais ok reste toujours à false.
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
4 mai 2012 à 11:56
Ce code fonctionne :
	string processDate = "20120504091204.078125+120";
processDate = processDate.Replace(".", ",").Replace("+", "E+");
double result = 0.0d;
bool ok = Double.TryParse(processDate, out result);
0
cs_jopop Messages postés 1540 Date d'inscription lundi 26 mai 2003 Statut Membre Dernière intervention 1 août 2013 12
4 mai 2012 à 12:03
Petite remarque en rab.
Les valeurs suivantes sont des doubles valides pour notre Culture :
"+123,456E+789"
"-123,456E+789"
"+123,456E-789"
"-123,456E-789"
Dans certains cas il est donc possible qu'un simple Replace te génère quelques surprises. A voir selon ton cas.
0
Rejoignez-nous