web-dev-qa-db-fra.com

Convertissez toutes les premières lettres en majuscules, restez plus bas 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 ma collection de chaînes, mais je ne sais pas comment procéder pour effectuer cette modification de texte.

106
mrblah
string s = "THIS IS MY TEXT RIGHT NOW";

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

Je préfère probablement invoquer le ToTitleCase de CultureInfo ( System.Globalization) que Thread.CurrentThread ( System.Threading)

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

mais il devrait être le même que la solution jspcal

[~ # ~] éditer [~ # ~]

En réalité, ces solutions ne sont pas les mêmes : CurrentThread --calls -> 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

Les références:

82
Filippo Vitale

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

La première consiste à créer une méthode qui met simplement le premier caractère en majuscule et ajoute 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 façon (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);
    }
16
Jamie Dixon

Si vous utilisez une page Web, vous pouvez également utiliser CSS:

style="text-transform:capitalize;"

9
M.Eren Çelik

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

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()));

En gros, il est écrit "préformez une correspondance regex sur toutes les occurrences d'un caractère alphanumérique qui suit un autre caractère alphanumérique, puis remplacez-le par une version minuscule de lui-même"

8
George Mauer

Quand construire de grandes tables est une préoccupation, la deuxième fonction de Jamie Dixon est la meilleure, mais elle ne fonctionne pas complètement comme elle est ...

Il ne prend pas toutes les lettres en minuscule et ne met en majuscule que la première lettre de la chaîne, pas la première lettre de chaque mot de la chaîne ... l'option ci-dessous corrige les deux problèmes suivants:

    public string UppercaseFirstEach(string s)
    {
        char[] a = s.ToLower().ToCharArray();

        for (int i = 0; i < a.Count(); i++ )
        {
            a[i] = i == 0 || a[i-1] == ' ' ? char.ToUpper(a[i]) : a[i];

        }

        return new string(a);
    }

Bien que, pour le moment, il reste encore à déterminer si l'option la plus rapide est toujours la plus rapide, la solution Regex proposée par George Mauer pourrait être plus rapide ... une personne assez intéressée devrait la tester.

6
Serj Sagan

Je ne sais pas si la solution ci-dessous est plus ou moins efficace que la réponse de jspcal, mais je suis presque certaine qu'elle nécessite moins de création d'objet que celle de Jamie et de George.

string s = "THIS IS MY TEXT RIGHT NOW";
StringBuilder sb = new StringBuilder(s.Length);
bool capitalize = true;
foreach (char c in s) {
    sb.Append(capitalize ? Char.ToUpper(c) : Char.ToLower(c));
    capitalize = !Char.IsLetter(c);
}
return sb.ToString();
2
ephemient

Essayez cette technique. Il retourne le résultat souhaité

CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());

Et n'oubliez pas d'utiliser System.Globalization.

0
X Stylish

En plus de la première réponse, n'oubliez pas de changer l'index de début de sélection de chaîne à la fin du mot ou vous obtiendrez l'ordre inverse des lettres dans la chaîne.

s.SelectionStart=s.Length;
0
zia khan