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 ?
@+
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 ?
@+
C'est trop vague. Mais a premiere vue, une seule solution: retrousses tes manches et implemntes toi meme ta fonctions (ou classe)![]()
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...
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é![]()
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" ...
@+
Bon, j'ai fait comme ça :
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* ?
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 );
Car moi je voulias faire :
num = atoi( (*iter).c_str() );
mais il me le refuse.
@+
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é :
PS : c'est dingue cette manie de voir le caractère '0' comme le code ASCII 48 plutôt que '0' ...
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 }
Mieux que SDL : découvrez SFML
Mes tutoriels 2D/3D/Jeux/C++, Cours et tutoriels C++, FAQ C++, Forum C++.
Partager