IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

problème avec la fonction Convert.ToDouble


Sujet :

C#

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut problème avec la fonction Convert.ToDouble
    Bonjour,
    J'ai un prog qui prend un id (un numéro de ticket) de 10 chiffres (8.2) sous forme d'une chaine de caractères e.g. 00000045.02.
    Dans l'etat actuel le user est obligé de rentrer les 0 superflus.
    J'ai donc converti ma chaine en double
    pour pouvoir formater avec le bon nombre de 0.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    ==============
     
    // Avant ==> opt = my_CRI.get_CRI(CR[J]);
     
    double val = Convert.ToDouble(CR[j]);
    string ID = String.Format("{0:00000000.00}", val);
     
    opt = my_CRI.get_CRI(ID);
     
    ===============
    Ça marche très bien ds l'IDE mais en production j'ai une exception due a ma conversion lorsque je clique pour traiter la chaine entrée (ex 52.01)
    ===============
    System.FormatException: Input string was not in a correct format.
    at System.Number.ParseDouble(String s, NumberStyles style, NumberFormatInfo info)
    at System.Double.Parse(String s, NumberStyles style, IFormatProvider provider)
    at System.Convert.ToDouble(String value)
    at clear_ddts.Traitement.Traitement_choice(String Item, String Texte) in d:\antoine\devsuptools\dct_clear_ddts\clear_ddts\choixtraitement.cs:line 153
    ===============
    Comprenez vs d'où vient l'erreur et comment coder ca ?

    Merci de votre aide
    Antoine

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Salut,

    Ce serait un problème de culture courante que tu as ?
    Si je dit pas de bêtises, dans la culture en-US, le type double prend la forme xxx.xx alors que dans la culture fr-FR, le type double prend la forme xxx,xx

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Double.Parse doit pouvoir t'offrir plus de tuning au niveau du format

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Il peut très bien le faire aussi avec le Convert.toDouble() en utilisant la signature avec le paramètre de type IFormatProvider.

    D'ailleurs si tu regarde la trace de son erreur, tu t'aperçois que Double.Parse est appelé par Convert.toDouble.
    Perso, je préfère utiliser le Convert.ToDouble() mais c'est plus par habitude que par réelle raison.

  5. #5
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par mattofmath Voir le message
    Il peut très bien le faire aussi avec le Convert.toDouble() en utilisant la signature avec le paramètre de type IFormatProvider.

    D'ailleurs si tu regarde la trace de son erreur, tu t'aperçois que Double.Parse est appelé par Convert.toDouble.
    Perso, je préfère utiliser le Convert.ToDouble() mais c'est plus par habitude que par réelle raison.
    Certes mais Double.Parse t'offres quand même plus de choix (notamment la possibilité d'utiliser les NumberStyles)

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos réponses
    Donc c'est 1 pb de notation (, a la place du .)
    il suffit que j'écrive ca
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string ID = String.Format("{0:00000000,00}", val);
    ou c'est plus compliqué ?

    crdlt Antoine

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Oui c'est un problème de notation selon la culture courante.

    La solution que j'aurais adoptée serait plutôt la suivante (pas vérifiée):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     NumberFormatInfo provider = new NumberFormatInfo( );
     provider.NumberDecimalSeparator = ".";
     double val = Convert.ToDouble(CR[j], provider);
    Regarde ce lien msdn pour un exemple concret

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci
    J'essaierai ca lundi au boulot !
    Bonnes Fêtes a tous.
    Antoine

  9. #9
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    tu peux tout simplement changer les options régionales dans le panneau de configuration

  10. #10
    Membre habitué
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    206
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 206
    Points : 196
    Points
    196
    Par défaut
    Citation Envoyé par 3aychoucha Voir le message
    tu peux tout simplement changer les options régionales dans le panneau de configuration
    Ben c'est quand même mieux de ne pas modifier la configuration de ton poste uniquement pour ton application et de tout gérer via le NumberDecimalSeparator, surtout si cette application est destinée à de la prod., donc peut-être à plusieurs postes sur lesquels il n'est pas judicieux de devoir faire la modification dans le panneau de configuration.


  11. #11
    Membre habitué
    Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2010
    Messages
    382
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Octobre 2010
    Messages : 382
    Points : 174
    Points
    174
    Par défaut
    Citation Envoyé par kineton Voir le message
    Ben c'est quand même mieux de ne pas modifier la configuration de ton poste uniquement pour ton application et de tout gérer via le NumberDecimalSeparator, surtout si cette application est destinée à de la prod., donc peut-être à plusieurs postes sur lesquels il n'est pas judicieux de devoir faire la modification dans le panneau de configuration.

    Personnellement c'est ce que j'ai fait avec mon application, car j'ai des fichiers à manipuler.
    Par exemple si dans mon fichier j'ai des doubles avec virgules et je veux que mon séparateur soit un point, j'utilise NumberDecimalSeparator, mais dans ce que j'aurai des doubles avec virgules(les anciennes valeurs) et des doubles avec des points dans mon fichier. et si j'essaye de récupérer ces doubles, la conversion ne me donne pas toutes les valeurs
    Dans ce cas je crois que le NumberDecimalSeparator ne peut pas résoudre le problème. et Est ce que je doit parcourir tous le fichier pour changer la virgule en un point????!!!!

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 60
    Points : 71
    Points
    71
    Par défaut
    Je suis plutôt de l'avis de Kineton.
    D'autant plus qu'il me semble que le sujet figurait dans la section asp.net et si dans le développement de wac92, la culture courante est gérée en fonction du navigateur web, le changement dans le panneau de configuration n'est pas vraiment la bonne solution.

    D'autant plus que j'ai l'impression que dans son cas, l'ID (numéro de ticket) n'est pas exactement ce qu'on appelle un double au sens mathématique mais plutôt une string composée uniquement de chiffres avec un séparateur quelconque. Dans son cas, il s'agit d'un "." mais ça pourrait très bien être un "/".
    La conversion en type double lui permet de simplifier le formatage final en rajoutant les 0 manquants.

  13. #13
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Citation Envoyé par 3aychoucha Voir le message
    Personnellement c'est ce que j'ai fait avec mon application, car j'ai des fichiers à manipuler.
    Par exemple si dans mon fichier j'ai des doubles avec virgules et je veux que mon séparateur soit un point, j'utilise NumberDecimalSeparator, mais dans ce que j'aurai des doubles avec virgules(les anciennes valeurs) et des doubles avec des points dans mon fichier. et si j'essaye de récupérer ces doubles, la conversion ne me donne pas toutes les valeurs
    Dans ce cas je crois que le NumberDecimalSeparator ne peut pas résoudre le problème. et Est ce que je doit parcourir tous le fichier pour changer la virgule en un point????!!!!
    Va expliquer aux traders de New York ou de Hong Kong de ma banque (ou même aux utilisateurs des 10000postes clients) qu'il faut changer les options régionales et les mettre en Francais car le développeur ne voulait pas jouer avec NumberDecimalSeparator. Ils vont bien rigoler

  14. #14
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bon,

    Cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    double val = Convert.ToDouble(CR[j], provider);
    plante toujours mon programme.

    Donc, j'ai change de tactique :
    j'ai concaténé la réponse reçue a la chaine "0000000"
    et j'ai pris les 11 derniers caractères.

    Merci de votre aide.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec une fonction date.
    Par kmayoyota dans le forum ASP
    Réponses: 8
    Dernier message: 09/09/2004, 12h33
  2. Problème avec la fonction findfirst ()
    Par Angelico dans le forum Windows
    Réponses: 3
    Dernier message: 05/08/2004, 20h40
  3. [Requete SQL en VBA] Problème avec la fonction FLOOR
    Par zubral dans le forum Langage SQL
    Réponses: 4
    Dernier message: 13/07/2004, 13h24
  4. Problème avec les fonctions
    Par jvachez dans le forum PostgreSQL
    Réponses: 1
    Dernier message: 13/01/2004, 12h06
  5. [Postgresql]Problème avec les fonctions ...
    Par fet dans le forum Requêtes
    Réponses: 4
    Dernier message: 02/10/2003, 09h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo