Mise en forme d'une chaine de caractères

Résolu
TTMan Messages postés 104 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 12 février 2007 - 22 déc. 2005 à 17:07
TTMan Messages postés 104 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 12 février 2007 - 23 déc. 2005 à 13:01
Bonjour!

J'utilise une variable de type "string" en C# et j'aimerais la formatter en "Nom Propre", c'est à dire, une majuscule à chaque nouveau mot avec (ça serait le top) la possibilité d'exclure certains mots comme "le", "la", "de"....
Si quelqu'un a vu un bout de code sympa qui pourrais me mettre sur la voie ou carrément une classe de manipulation de string déjà bien aboutie, je suis preneur...
Merci!

TTMan

PS: c'est assez UrgenT.

7 réponses

TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
22 déc. 2005 à 23:30
En bourrin çà donne çà :

string[] mots = phrase.Split(' ');


StringCollection badWords =
new StringCollection();
badWords.Add("le");
badWords.Add("la");
System.Text.StringBuilder sb =
new System.Text.StringBuilder();



for (
int i = 0; i < mots.Length; ++i)
{

string mot = mots[i];
mot = !badWords.Contains(mot.ToLower()) ? mot.Remove(0,1).Insert(0,
char.ToUpper(mot[0]).ToString()) : mot;
sb.AppendFormat("{0} ", mot);
}
phrase = sb.ToString();

::|The S@ib|::
MVP C#.NET
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
23 déc. 2005 à 12:05
d'ailleur, je viens de me rendre compte qu'il manque un truc dans mon code :

private string UpperCaseWordsInSentence(string sentence) {
StringBuilder ret = new StringBuilder();
StringCollection badWords = new StringCollection();
// c'est une bonne id‚e ca ;)
badWords.Add("le");
badWords.Add("la");
// etc...
Regex regex = new Regex(@"\w+");
// recherche tous les mots de la chaine
int index = 0;
foreach (Match m in regex.Matches(sentence))
{
ret.Append(sentence.Substring(index, m.Index - index));
if (badWords.Contains(m.Value.ToLowerInvariant()))
{
ret.Append(m.Value);
} else {
ret.Append(m.Value.Substring(0, 1).ToUpper());
ret.Append(m.Value.Substring(1).ToLower());
}
index = m.Index + m.Length;
}
ret.Append(sentence.SubString(index));
return ret.ToString();
}

le même code avec un for à la place du foreach :
private string UpperCaseWordsInSentence(string sentence) {
StringBuilder ret = new StringBuilder();
StringCollection badWords = new StringCollection(); // c'est une bonne id‚e ca ;)
badWords.Add("le");
badWords.Add("la");
// etc...
Regex regex = new Regex(@"\w+");
// recherche tous les mots de la chaine
int index = 0;
Match m;
MatchCollection matches = regex.Matches(sentence);
for (int i=0; i< matches.Count; i++)
{
m = matches[i];
ret.Append(sentence.Substring(index, m.Index - index));
if (badWords.Contains(m.Value.ToLowerInvariant()))
{
ret.Append(m.Value);
} else {
ret.Append(m.Value.Substring(0, 1).ToUpper());
ret.Append(m.Value.Substring(1).ToLower());
}
index = m.Index + m.Length;
}
ret.Append(sentence.SubString(index));
return ret.ToString();
}

Sébastien FERRAND
[MVP C#]
3
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
23 déc. 2005 à 09:33
en non bourin, ca donne ca :



private
string UpperCaseWordsInSentence(
string sentence) {

StringBuilder ret =
new
StringBuilder();

StringCollection badWords =
new
StringCollection();
// c'est une bonne id‚e ca ;)
badWords.Add(
"le");
badWords.Add(
"la");
// etc...
Regex regex =
new
Regex(
@"\w+");
// recherche tous les mots de la chaine
int index = 0;

foreach (
Match m
in regex.Matches(sentence))
{
ret.Append(sentence.Substring(index, m.Index - index));

if (badWords.Contains(m.Value.ToLowerInvariant()))
{
ret.Append(m.Value);
}
else {
ret.Append(m.Value.Substring(0, 1).ToUpper());
ret.Append(m.Value.Substring(1).ToLower());
}
index = m.Index + m.Length;
}

return ret.ToString();
}



un exemple :
Bonjour!


J'Utilise Une Variable De Type "String" En C# Et J'Aimerais la Formatter En "Nom Propre", C'Est À Dire, Une Majuscule À Chaque Nouveau Mot Avec (Ça Serait le Top) la Possibilité D'Exclure Certains Mots Comme "le", "la", "De"....
Si Quelqu'Un A Vu Un Bout De Code Sympa Qui Pourrais Me Mettre Sur la Voie Ou Carrément Une Classe De Manipulation De String Déjà Bien Aboutie, Je Suis Preneur...
Merci

Sébastien FERRAND
[MVP C#]
0
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
23 déc. 2005 à 11:23
En encore moins bourrins tu compiles ta regex.

Bien que le tiens soit plus propre , je me demande si il est plus rapide.

::|The S@ib|::
MVP C#.NET
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
TheSaib Messages postés 2367 Date d'inscription mardi 17 avril 2001 Statut Membre Dernière intervention 26 décembre 2007 23
23 déc. 2005 à 11:36
Bon
Le tiens est deux-trois fois plus long en normal et deux fois en compilé sur un texte de 700 lignes.

NB : Dans les 3 cas ca prends moins de deux secondes.

::|The S@ib|::
MVP C#.NET
0
sebmafate Messages postés 4936 Date d'inscription lundi 17 février 2003 Statut Membre Dernière intervention 14 février 2014 37
23 déc. 2005 à 11:58
mouaip... la regex qui fait ca...

on doit aussi pouvoir optimiser la boucle en mettant un for à la place du foreach

Sébastien FERRAND
[MVP C#]
0
TTMan Messages postés 104 Date d'inscription lundi 17 décembre 2001 Statut Membre Dernière intervention 12 février 2007
23 déc. 2005 à 13:01
Merci à tous les deux. Vous m'enlevez une grosse épine du pied.


TTMan
0
Rejoignez-nous