C# - Récupérer les entiers d'une chaine de caractère [Résolu]

plop3000 135 Messages postés mercredi 23 mai 2007Date d'inscription 7 avril 2012 Dernière intervention - 31 mai 2007 à 11:43 - Dernière réponse : cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention
- 2 juin 2007 à 23:07
Bonjour,

J'aimerais savoir si il existe une fonction qui permettrait à partir d'une chaine de caractères de retournes les entiers qui sont dans cette chaine.
Par exemple :  fonction("une chaine avec 1 entier") retournerait 1
                      fonction("1 chaine 2 caractères") retournerit 1 et 2 (dans un tableau par exemple).

Voila, si quelqu'un connait une fonction... Je ne vois pas vraiment comment la programmer.

Merci d'avance
Afficher la suite 

16 réponses

Répondre au sujet
plop3000 135 Messages postés mercredi 23 mai 2007Date d'inscription 7 avril 2012 Dernière intervention - 31 mai 2007 à 15:44
+3
Utile
Problème résolu, c'est ma regexp qui n'était pas bonne.



Regex



reg =

new



Regex
(

@"\b*\d+(,?|.?)\d*\b"
);


MatchCollection
matches = reg.Matches(phrase);


foreach
(

Match
m

in
matches){


         MessageBox
.Show(m.Value);}

Merci tout le monde 
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de plop3000
catamenia 119 Messages postés mercredi 15 octobre 2003Date d'inscription 21 juillet 2009 Dernière intervention - 31 mai 2007 à 11:54
0
Utile
Bonjour,

Je ne sais pas s'il existe une fonction mais pour la coder je ferais :

- lecture des caratères un par un jusqu'à trouver un chiffre.
- une fois un chiffre trouvé le placer dans une autre chaine temp
- lecture de la suite de la chaine caractere par caractere jusqu'à trouvé autre chose qu'un chiffre en ajoutant chaque chiffre trouvé à la suite de la chaine temp.
- convertir la chaine temp qui est un entier en int et le placer dans une liste.
- vider la chaine temp
- continuer comme ça jusqu'à la fin de la chaine afin de trouver tous les nombres
- renvoyer la liste
Commenter la réponse de catamenia
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 31 mai 2007 à 12:19
0
Utile
moi j'utiliserais une expression régulière !

un simple \d+ permet de faire plus de choses !

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
plop3000 135 Messages postés mercredi 23 mai 2007Date d'inscription 7 avril 2012 Dernière intervention - 31 mai 2007 à 14:15
0
Utile
J'ai fais en gros ce que tu as dis Catamania. Sebmafate, je ne vois pas comment on fait pour utiliser une expression régulière en C#, pourrais tu me donner un exemple simple stp?

Sinon, voila le code que j'ai fait  (si ça peut servir à quelqu'un...)

private

String[] rendLesNumDUnString(String phrase)
{

//prend en parametre une phrase et rend un tableau

//contenant les entiers (ou réels) qui sont dans

//cette phrase

String[] maPhrase = phrase.Split();

String[] tabResult = newString[maPhrase.Length];

//le nombre de mots dans la phrase

int nbMots = maPhrase.Length;

for (int i = 0; i < nbMots; i++)

{

String motCourant = maPhrase[i];

int tailleMotCourant = motCourant.Length;

String debutDeChiffre = "";

//parcours du mot

for (int j = 0; j < tailleMotCourant; j++)

{

String lettreCourante = motCourant.Substring(j,1);

if (unePartieDUnNombre(lettreCourante))

{

debutDeChiffre += lettreCourante;

}

else

{

//ça ne peut pas être un nombre

debutDeChiffre = "";

}

}

if (!(debutDeChiffre.Equals("")) && !(debutDeChiffre.Equals(",")) &&

!(debutDeChiffre.Equals(".")))

{

tabResult[i] = debutDeChiffre;

}

}

return tabResult;

}

(ouch, ça indente mal désolé  !)
Ainsi qu'une fonction qui permet de reconnaitre si une lettre peut faire partie d'un nombre :

private
bool unePartieDUnNombre(String lettre)

{

//prend une lettre (de type string) et rend

//vrai si cette lettre peut faire partie d'un

//nombre (un chiffre ou bien "," ou "."

if(lettre.Equals("0") || lettre.Equals("1") || lettre.Equals("2") ||

lettre.Equals("3") || lettre.Equals("4") || lettre.Equals("5") ||

lettre.Equals("6") || lettre.Equals("7") || lettre.Equals("8") ||

lettre.Equals("9") || lettre.Equals(",") || lettre.Equals(".") ||

//Pour récupérer les pourcentages aussi (à voir)

lettre.Equals("%"))

{

returntrue;

}

else

{

returnfalse;

}

}

ça fonctionne plutot bien (sauf cas particuliers pas encore traité du genre "ma chaine t12" qui rend 12 alors que t12 n'est pas un nombre). Je m'occupe des cas particuliers maintenant   

Merci pour votre aide
Commenter la réponse de plop3000
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 31 mai 2007 à 14:33
0
Utile
essaye ceci :

MatchCollection matches = Regex.Matches(phrase, "\b\d+\b");

et dans matches normalement tu as tous les chiffres de ta chaine !

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 31 mai 2007 à 14:35
0
Utile
ooops...
MatchCollection matches = Regex.Matches(phrase, @"\b\d+\b");

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
plop3000 135 Messages postés mercredi 23 mai 2007Date d'inscription 7 avril 2012 Dernière intervention - 31 mai 2007 à 15:19
0
Utile
Merci pour ta réponse rapide Sebmafate. J'essaye de faire quelquechose avec une expression régulière maintenant (ça serait beaucoup plus court en code apparement ).

MatchCollection matches = Regex.Matches(phrase, @"^\b*\d+(,?|.?)\d*\b");

J'ai rajouté (,?|.?) car je veux aussi récupérer les chiffres à virgules. Mais je ne vois pas comment il faut faire après pour afficher les résultats (dans une messageBox par exemple) ? J'ai cherché et apparement ça ne fonctionne pas comme un tableau, bien que le MatchCollection contienne a priori plusieurs nombres. Comment se fait le parcours d'un matchCollection puis l'affichage?
J'ai tenté ça :

foreach

(
Match m
in mc){

      MessageBox.Show((m.Groups[
"$1"]).ToString());}

mais ça ne fonctionne pas 
Commenter la réponse de plop3000
SharpMao 1025 Messages postés mardi 4 février 2003Date d'inscription 7 juin 2010 Dernière intervention - 31 mai 2007 à 15:50
0
Utile
Hello,

Fais attention tout de même, sauf erreur, le . dans les expressions régulières signifie "n'importe qule caractère".
Utilise \. pour matcher un '.'

Si tu veux utiliser un peu les expressions régulières, je te conseille expresso, un excellent programme pour construire et tester des expression régulières, et en plus, c'est gratuit !

Amicalement, SharpMao

"C'est pas parce qu'ils sont nombreux à avoir tort qu'ils ont raison!"
(Coluche / 1944-1986 / Pensées et anecdotes)
Commenter la réponse de SharpMao
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 31 mai 2007 à 15:58
0
Utile
Y'a aussi le "MAFTOOLS : TESTEUR D'EXPRESSIONS RÉGULIÈRES" qui est gratuit, open source, et le sommet: disponible sur CodeS-SourceS!!!
C'est ici.

<hr />
-Blog-
Commenter la réponse de cs_Bidou
plop3000 135 Messages postés mercredi 23 mai 2007Date d'inscription 7 avril 2012 Dernière intervention - 31 mai 2007 à 16:45
0
Utile
Merci  en effet le "." signifie un caractère quelconque. J'ai donc mis [,|.] au lieu de (,|.)
D'ailleurs si quelqu'un sait quelle différence il y a entre faire (,|\.) et [,|.] je veux bien une explication  .  Je testerai expresso et matfools, merci 
Commenter la réponse de plop3000
sebmafate 4947 Messages postés lundi 17 février 2003Date d'inscription 14 février 2014 Dernière intervention - 31 mai 2007 à 20:45
0
Utile
Merci bidou :)

Sébastien FERRAND (blog)
Consultant Indépendant
[Microsoft Visual C# MVP]
Commenter la réponse de sebmafate
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 2 juin 2007 à 20:08
0
Utile
Non, je ne culpabiliserais pas !

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
plop3000 135 Messages postés mercredi 23 mai 2007Date d'inscription 7 avril 2012 Dernière intervention - 2 juin 2007 à 20:48
0
Utile
Comment ?  Je ne  comprend pas... 
Commenter la réponse de plop3000
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 2 juin 2007 à 20:56
0
Utile
C'était en rapport avec ça, pas directement avec la question ^^ : http://blogs.codes-sources.com/coq/archive/2007/04/22/quelques-outils-pour-tester-ses-regex.aspx

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juin 2007 à 21:40
0
Utile
lol coq, désolé je me souvenais de la source de Seb' mais pas de ton message sur ton blog...
Sans rancune? lol

<hr />
-Blog-
Commenter la réponse de cs_Bidou
cs_coq 6366 Messages postés samedi 1 juin 2002Date d'inscription 2 août 2014 Dernière intervention - 2 juin 2007 à 23:07
0
Utile
1 partout :p
(mais je disais pas ça pour ça, juste que moi j'avais oubliée celle de de Seb :-D)

/*
coq
MVP Visual C#
CoqBlog
*/
Commenter la réponse de cs_coq

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.