Mise en forme d'une chaine de caractères [Résolu]

Signaler
Messages postés
104
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
12 février 2007
-
Messages postés
104
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
12 février 2007
-
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

Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
15
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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
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#]
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
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#]
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
15
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
Messages postés
2368
Date d'inscription
mardi 17 avril 2001
Statut
Modérateur
Dernière intervention
26 décembre 2007
15
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
Messages postés
4936
Date d'inscription
lundi 17 février 2003
Statut
Modérateur
Dernière intervention
14 février 2014
32
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#]
Messages postés
104
Date d'inscription
lundi 17 décembre 2001
Statut
Membre
Dernière intervention
12 février 2007

Merci à tous les deux. Vous m'enlevez une grosse épine du pied.


TTMan