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 :

Extraction de chiffres d'une chaîne


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut Extraction de chiffres d'une chaîne
    Bonjour,

    je recherche une solution me permettant d'extraire les caractères numériques d'une chaîne, pour en obtenir un int.
    Exemple :
    "AZ005" --> 5
    "ERT84" --> 84

    Quelle solution me préconisez-vous ?

    @+

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2003
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Septembre 2003
    Messages : 49
    Par défaut
    C'est trop vague. Mais a premiere vue, une seule solution: retrousses tes manches et implemntes toi meme ta fonctions (ou classe)

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 24
    Par défaut
    Bonjour,
    tu parcours la chaine de caractères, pour chaque caractère, si c'est un nombre, tu le copies dans un buffer ou tu l'affiches (enfin ce que tu veux ^^) sinon bah rien, donc on passe au caractère suivant.

    Pour savoir si c'est un entier tu peut prendre sa valeur ASCII et regarder si elle se trouve dans l'intervalle 47-58 ou pas...

  4. #4
    Membre expérimenté Avatar de Ksempac
    Inscrit en
    Février 2007
    Messages
    165
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 165
    Par défaut
    Je ne sais pas si tu cherches une solution clé en main (je crois pas qu'il y en est) ou si tu cherches une facon d'implementer la chose.

    Une facon d'implementer :

    -Parcours ta chaine caractere par caractere
    -Si le code ASCII est compris dans l'intervalle des codes ASCII des chiffres (30 a 39 en hexa, 48 a 57 en decimal) : Tu crees une nouvelle chaine dans lequel tu mets ton caractere
    -Continue de parcourir caractere par caractere, tant que ce sont encore des code ASCII correspondant a tes chiffres, tu les ajoutes a ta 2nde chaine, et des que tu tombes sur un caractere qui n'est pas un chiffre ou que tu arrives a la fin de ta chaine, tu arretes d'ajouter les caracteres
    -Enfin tu transforme ta chaine en long a l'aide de la fonction strol
    -Si il est possible qu'une chaine contienne plus qu'un seul entier, tu reprends l'algorithme a partir du dernier caractere examiné

    Exemple pour que ce soit plus clair :

    ART84E5
    Tu lis A,R,T sans rien faire
    Puis tu lis 8, tu le mets dans une nouvelle chaine
    Tu lis 4 c'est encore un chiffre, tu le rajoute a ta 2nde chaine qui contient maintenant "84"
    Tu lis E, c'est plus un chiffre, tu transformes alors ta 2nde chaine en un entier qui vaut 84
    Tu lis le caractere suivant, 5, c'est un chiffre, tu crees une nouvelle chaine
    Tu arrives au bout de ta chaine, donc tu peux a nouveau transformer la chaine "5" en un entier de valeur 5

    EDIT : Grillé

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    Bonjour,

    merci pour vos conseils.
    Disons que je n'aurais que le cas suivant :
    des lettres, puis des chiffres.
    Ex : DER002, KL78965, SZ001 ...

    Mais de toute façon, je vais être obligé de faire un parcours "à la main" ...
    @+

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    577
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 577
    Par défaut
    Bon, j'ai fait comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    std::string id = "AZE4569";
    int num = 0;
    std::string::const_iterator iter = std::find_if( id.begin(), id.end(), isdigit );
    if( iter != id.end() )
        num = atoi( iter );
    mais j'avoue que je ne comprends pas trop de que fait le compilo : j'ai l'impression qu'il me convertir automatiquement iter en const char* ?
    Car moi je voulias faire :
    num = atoi( (*iter).c_str() );
    mais il me le refuse.

    @+

  7. #7
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    Puisque le format est fixé (que des lettres puis que des chiffres) il suffit de trouver le premier chiffre, d'extraire la sous-chaîne correspondante (donc jusqu'à la fin), puis de la convertir en nombre avec un istringstream.

    Code non testé :
    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
    static const std::string Numbers = "0123456789";
     
    unsigned int num = 0;
    std::string id = "AZE4569";
    std::string::size_type Pos = id.find_first_of(Numbers);
    if (Pos != std::string::npos)
    {
        std::istringstream iss(id.substr(Pos));
        if (iss >> num)
        {
            // OK !
        }
        else
        {
            // Erreur : nombre invalide
        }
    }
    else
    {
        // Erreur : aucun chiffre dans l'identifiant
    }
    PS : c'est dingue cette manie de voir le caractère '0' comme le code ASCII 48 plutôt que '0' ...

Discussions similaires

  1. Réponses: 8
    Dernier message: 02/09/2008, 14h28
  2. Séparation des lettres et des chiffres d'une chaîne
    Par camoa dans le forum Assembleur
    Réponses: 2
    Dernier message: 24/01/2007, 17h46
  3. Réponses: 4
    Dernier message: 09/11/2006, 00h32
  4. [Tableaux] Extraire les chiffres dans une chaîne
    Par Digiduck dans le forum Langage
    Réponses: 8
    Dernier message: 16/08/2006, 14h33
  5. Extraction de variables dans une chaîne
    Par Spack dans le forum Général Python
    Réponses: 6
    Dernier message: 20/05/2006, 19h42

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