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 :

Transformer une chaine de caractère en double


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Transformer une chaine de caractère en double
    Bonjour tout le monde,

    J'ai un tableau de caractère char Solde[15];

    Ce tableau contient par exemple :

    8447,8630

    J'aimerais transformer ce char[] en double.

    J'ai fait une recherche sur le forum et j'ai trouvé certains posts intéressant mais avec des fonctions que je n'ai pas encore appris.

    En espèrant que vous saurez m'aider.

    Merci d'avance.

    beegees

  2. #2
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Points : 169
    Points
    169
    Par défaut
    Pour convertir une chaine en double deux fonctions: sscanf() qui est une fonction généraliste ou atod() qui est spécialisée. Les fonctions ato... permettent de convertir les chaines, atoi() en int, atol() en en long etc..

    Cependant elles ne sont pas toujours présentes (mais on peut les écrire facilement), sscanf si par contre.

  3. #3
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    strtod().
    Mais je ne sais plus si de base, cette fonction attend une virgule ou un point...

  4. #4
    Membre habitué Avatar de archer
    Ingénieur développement logiciels
    Inscrit en
    Mai 2007
    Messages
    338
    Détails du profil
    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2007
    Messages : 338
    Points : 180
    Points
    180
    Par défaut
    Salut
    tu peux utiliser la fonction:
    double atof(char *chaine) prototype dans stdlib.h et math.h

  5. #5
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Salut à tous,

    Merci pour vos réponses !

    J'ai testé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    double somme = 0;
    somme = sscanf(Solde,"%lg");
    ça me donne 1.00000000000000000

    Qu'en pensez-vous ?

    Merci d'avance pour votre aide.

    beegees

  6. #6
    Membre averti Avatar de _SamSoft_
    Profil pro
    Étudiant
    Inscrit en
    Février 2007
    Messages
    798
    Détails du profil
    Informations personnelles :
    Âge : 32
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2007
    Messages : 798
    Points : 345
    Points
    345
    Par défaut
    J'aurais fait (attention presque pseudo code )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    char c[128];
    double d = 0;
     
    fgets(c, sizeof c, stdin);
    /* fclean */
    d = atod(c);
    code non testé

  7. #7
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    Merci Samsoft,

    Ton code m'a l'aire sympa, je vais le tester.

    Je continue pour l'instant ma piste du sscanf.

    Je l'ai utilisé comme le scanf et somme vaut maintenant :

    8447.00000000000

    Je n'ai malheureusement pas les décimals

    ça avance mais c'est pas encore tout à fait ça.

    Merci d'avance pour votre aide.

    beegees

  8. #8
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Comme l'a signalé Medinoc, si le séparateur décimal est ',' il y aura problème. Utilise strchr pour rechercher ',' et la remplacer par '.' avant la conversion

  9. #9
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    magnifique, ça fonctionne

    Dire que j'ai perdu mon temps à chercher comment remplacer le point par une virgule alors que je n'en avais pas besoin

    Bonne soirée à vous tous et encore merci

    beegees

  10. #10
    En attente de confirmation mail
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    133
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 133
    Points : 169
    Points
    169
    Par défaut
    Oui, apparemment atod n'existe pas en standard, désolé. strtod() ou atof() donc.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int resultat ;
     
    resultat  =  sscanf(Solde,"%lg", &somme);
    Ensuite à charge de tester la valeur de retour. "%lg" je ne sais pas il faut vérifier dans la page man.

  11. #11
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut
    ça fonctionne nikel avec sscanf, je reste donc avec sscanf.

    Merci à toi.

    beegees

  12. #12
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    strtod().
    Mais je ne sais plus si de base, cette fonction attend une virgule ou un point...
    Citation Envoyé par diogene Voir le message
    Comme l'a signalé Medinoc, si le séparateur décimal est ',' il y aura problème. Utilise strchr pour rechercher ',' et la remplacer par '.' avant la conversion
    Pour mettre tout le monde d'accord, un exemple vaut mieux qu' un long discours :
    on néglige trop souvent la puissance de setlocale()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    #include <stdio.h>
    #include <stdlib.h>
    #include <locale.h>
     
    int main (void)
    {
       double var;
       char chaine[] = "166.35";
       char chaine2[] = "166,35";
       /* sans setlocale() ===================================================== */
       puts("sans setlocale()");
     
       printf("%s avec strtod() : %g\n", 
               chaine, strtod(chaine, NULL));
       printf("%s avec strtod() : %g\n", 
               chaine2, strtod(chaine2, NULL));
     
       sscanf(chaine, "%lg", &var);
       printf("%s avec sscanf() : %g\n", chaine, var);
       sscanf(chaine2, "%lg", &var);
       printf("%s avec sscanf() : %g\n", chaine2, var);
     
       /* sans setlocale() ===================================================== */   
       setlocale(LC_ALL, "");/* on prend en compte les spécificités locales */
       puts("avec setlocale()");
     
       printf("%s avec strtod() : %g\n", 
               chaine, strtod(chaine, NULL));
       printf("%s avec strtod() : %g\n", 
               chaine2, strtod(chaine2, NULL));
     
       sscanf(chaine, "%lg", &var);
       printf("%s avec sscanf() : %g\n", chaine, var);
       sscanf(chaine2, "%lg", &var);
       printf("%s avec sscanf() : %g\n", chaine2, var);
     
       getchar();
       return EXIT_SUCCESS;
    }

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

Discussions similaires

  1. Transformer une chaine de caractères
    Par lcoulon dans le forum Débuter
    Réponses: 9
    Dernier message: 14/02/2011, 11h14
  2. Transformer une chaine de caractère
    Par Invité dans le forum Django
    Réponses: 3
    Dernier message: 06/03/2009, 09h57
  3. Réponses: 3
    Dernier message: 12/06/2006, 11h18
  4. Réponses: 2
    Dernier message: 03/10/2005, 16h23
  5. Réponses: 2
    Dernier message: 14/01/2005, 15h40

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