110 votes

Convertir toutes les premières lettres en majuscules, le reste en minuscules pour chaque mot

J'ai une chaîne de texte (environ 5-6 mots pour la plupart) que je dois convertir.

Actuellement, le texte ressemble à :

THIS IS MY TEXT RIGHT NOW

Je veux le convertir en :

This Is My Text Right Now

Je peux parcourir en boucle ma collection de chaînes de caractères, mais je ne suis pas sûr de savoir comment procéder pour effectuer cette modification de texte.

0 votes

254voto

jspcal Points 20715
string s = "THIS IS MY TEXT RIGHT NOW";

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

0 votes

Génial ! Je ne connaissais pas ça.

32 votes

Haha, vraiment ? C'est là que ça se passe ? J'adore .NET, mais certains concepteurs d'API sont de vrais crétins.

7 votes

Notez que, bien que cette méthode fasse ce que l'auteur de la question a demandé, il s'agit d'un algorithme naïf qui se contente de mettre en majuscules chaque mot, sans tenir compte du type de mot. Il ne s'agit pas vraiment d'une "casse de titre", car les règles relatives à la casse de titre diffèrent selon les langues. Ce n'est même pas correct pour l'anglais. Par exemple, le titre "about a boy" devrait être "About a Boy" en anglais, mais cette méthode donnerait "About A Boy". Si vous voulez vrai Dans ce cas, vous devrez rédiger votre propre méthode.

84voto

Filippo Points 1964

Je préfère probablement invoquer le ToTitleCase de CultureInfo ( Système.globalisation ) que Thread.CurrentThread ( Système.Threading ) :

string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

Mais cela devrait être la même chose que La solution de jspcal .

EDIT

En fait, ces solutions sont pas la même chose : CurrentThread -Appels--> CultureInfo !


System.Threading.Thread.CurrentThread.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Threading.Thread.get_CurrentThread
IL_000B:  callvirt    System.Threading.Thread.get_CurrentCulture
IL_0010:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0015:  ldloc.0     // s
IL_0016:  callvirt    System.String.ToLower
IL_001B:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_0020:  stloc.0     // s

System.Globalization.CultureInfo.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Globalization.CultureInfo.get_CurrentCulture
IL_000B:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0010:  ldloc.0     // s
IL_0011:  callvirt    System.String.ToLower
IL_0016:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_001B:  stloc.0     // s

Références :

17voto

Jamie Dixon Points 23891

Il existe plusieurs façons de convertir le premier caractère d'une chaîne en majuscule.

La première solution consiste à créer une méthode qui se contente de mettre le premier caractère en majuscule et d'ajouter le reste de la chaîne à l'aide d'une sous-chaîne :

public string UppercaseFirst(string s)
{
    return char.ToUpper(s[0]) + s.Substring(1);
}

La deuxième méthode (qui est légèrement plus rapide) consiste à diviser la chaîne en un tableau de caractères, puis à reconstruire la chaîne :

public string UppercaseFirst(string s)
{
    char[] a = s.ToCharArray();
    a[0] = char.ToUpper(a[0]);
    return new string(a);
}

1 votes

Cette solution ne répond pas exactement à la question de manière adéquate. Le titre de la question est "Convertir toutes les premières lettres en majuscules, le reste en minuscules pour chaque mot". Cependant, cette solution ne met en majuscule que la première lettre de la chaîne entière. Par conséquent, cette solution convertirait "hello world" en "Hello world", plutôt qu'en "Hello World".

10voto

M.Eren Çelik Points 51

Si vous l'utilisez sur une page web, vous pouvez également utiliser le CSS :

style="text-transform:capitalize;"

2 votes

Pourquoi CSS ? Lorsque la question porte sur c# asp.net regex

2 votes

L'étiquette ASP.NET montre que l'OP le fait sur le WEB. Bien sûr, ce n'est pas la réponse à la question parce que l'OP a demandé la solution dans le site web. C# mais elle résout le problème et peut être une solution alternative. +1

9voto

George Mauer Points 22685

Non testé mais quelque chose comme ça devrait fonctionner :

var phrase = "THIS IS MY TEXT RIGHT NOW";
var rx = new System.Text.RegularExpressions.Regex(@"(?<=\w)\w");
var newString = rx.Replace(phrase,new MatchEvaluator(m=>m.Value.ToLowerInvariant()));

Essentiellement, cela signifie "effectuer une correspondance regex sur toutes les occurrences d'un caractère alphanumérique qui suit un autre caractère alphanumérique, puis le remplacer par une version minuscule de lui-même".

0 votes

Celui-ci fait également en sorte que tous les mots commencent par une majuscule et se poursuivent par une minuscule. Exactement ce que je recherchais.

0 votes

Avez-vous eu le temps de testez-le ?

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X