Existe-t-il un moyen simple de mettre en majuscule la première lettre d'une chaîne de caractères et de baisser le reste ? Existe-t-il une méthode intégrée ou dois-je en créer une moi-même ?
Réponses
Trop de publicités?Utilisez System.Globalization.TextInfo.ToTitleCase()
qui met en majuscules tous les mots de la chaîne :
string text = "john doe";
string result = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text);
// Produces "John Doe"
Voir aussi Lien MSDN pour une description détaillée.
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);
Le code ci-dessus ne fonctionne pas .....
donc mettez le code ci-dessous en convertissant en inférieur puis appliquez la fonction
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());
Il y a des cas où CultureInfo.CurrentCulture.TextInfo.ToTitleCase
ne peut pas gérer, par exemple : l'apostrophe '
.
string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo
A regex peut également être utilisé \b[a-zA-Z]
pour identifier le caractère de départ d'un mot après une limite de mot \b
il suffit alors de remplacer la correspondance par son équivalence en majuscules grâce à la fonction Regex.Replace(string input,string pattern,MatchEvaluator evaluator)
méthode :
string input = "o'reilly, m'grego, d'angelo";
input = Regex.Replace(input.ToLower(), @"\b[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo
El regex peut être ajusté si nécessaire, par exemple, si nous voulons gérer les MacDonald
y McFry
Dans ce cas, la regex devient : (?<=\b(?:mc|mac)?)[a-zA-Z]
string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald'S, McFry
Si nous devons gérer plus de préfixes, il suffit de modifier le groupe (?:mc|mac)
par exemple pour ajouter des préfixes français du, de
: (?:mc|mac|du|de)
.
Enfin, on peut se rendre compte que cette regex correspondra également au cas MacDonald'S
pour le dernier 's
Nous devons donc le gérer dans le regex avec un regard négatif derrière (?<!'s\b)
. A la fin, nous avons :
string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry
Mc et Mac sont des préfixes de nom de famille courants aux États-Unis, et il en existe d'autres. TextInfo.ToTitleCase ne gère pas ces cas et ne devrait pas être utilisé dans ce but. Voici comment je procède :
public static string ToTitleCase(string str)
{
string result = str;
if (!string.IsNullOrEmpty(str))
{
var words = str.Split(' ');
for (int index = 0; index < words.Length; index++)
{
var s = words[index];
if (s.Length > 0)
{
words[index] = s[0].ToString().ToUpper() + s.Substring(1);
}
}
result = string.Join(" ", words);
}
return result;
}