Comment capitaliser la première lettre du nom et de prénom en C#?

Est-il un moyen facile de mettre en majuscule la première lettre d'une chaîne et d'abaisser le reste? Y a-t-il une méthode intégrée ou dois-je faire la mienne?

138
demandé sur Gilles 2008-09-16 18:21:37

17 réponses

TextInfo.ToTitleCase() capitalise le premier caractère dans chaque jeton d'une chaîne.

S'il n'est pas nécessaire de maintenir L'Majuscule des acronymes, vous devez inclure ToLower() .

string s = "JOHN DOE";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
// Produces "John Doe"

si la culture actuelle n'est pas disponible, utiliser:

string s = "JOHN DOE";
s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower());

voir la lien MSDN pour une description détaillée.

255
répondu ageektrapped 2017-04-03 02:00:25
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
117
répondu Nathan Baulch 2008-09-16 14:25:21
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);

le code ci-dessus ne fonctionnera pas .....

donc mettez le code ci-dessous par convert en bas puis appliquer la fonction

String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());
30
répondu Ganesan SubbiahPandian 2011-06-28 13:30:17

il y a des cas que CultureInfo.CurrentCulture.TextInfo.ToTitleCase ne peut pas traiter, 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 , alors nous avons juste besoin de remplacer le match par son équivalent en majuscules grâce à la Regex.Replace(string input,string pattern,MatchEvaluator evaluator) 1519240920" 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

le regex peut être accordé si nécessaire, par exemple, si nous voulons Gérer les cas MacDonald et McFry le 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 manipuler plus de préfixes , nous n'avons qu'à modifier le groupe (?:mc|mac) , par exemple pour ajouter les préfixes Français du, de : (?:mc|mac|du|de) .

enfin, nous pouvons nous rendre compte que ce regex va également correspondre au cas MacDonald'S pour le dernier 's nous avons donc besoin de le gérer dans le regex avec un négatif regarder derrière (?<!'s\b) . À 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
12
répondu polkduran 2013-10-22 12:17:57

Mc et Mac sont des préfixes communs aux États-Unis, et il y en a d'autres. TextInfo.ToTitleCase ne gère pas ces cas et ne devrait pas être utilisé à cette fin. Voici comment je le fais:

    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;
    }
7
répondu Jamie Ide 2008-09-16 15:38:18

ToTitleCase () devrait fonctionner pour vous.

http://support.microsoft.com/kb/312890

5
répondu ckal 2008-09-16 14:25:03

l'option la plus directe sera d'utiliser la fonction ToTitleCase qui est disponible dans .NET qui devrait prendre soin du nom la plupart du temps. Comme GDE a souligné qu'il y a certains noms pour lesquels cela ne fonctionnera pas, mais ceux-ci sont assez rares donc à moins que vous cibliez une culture où de tels noms sont communs, il n'est pas nécessaire quelque chose que vous devez vous inquiéter trop.

cependant si vous n'êtes pas en travaillant avec un langauge.net, cela dépend de ce à quoi ressemble l'entrée - si vous avez deux champs séparés pour le prénom et le nom de famille, alors vous pouvez simplement capitaliser la première lettre en dessous du reste en utilisant des substrats.

firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower();
lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower();

cependant, si vous avez plusieurs noms dans la même chaîne de caractères, vous devez savoir comment vous obtenez l'information et la diviser en conséquence. Si vous obtenez un nom comme "John Doe" vous avez une scission de la chaîne basée sur le caractère espace. S'il est dans un format tel que "Doe, John" vous allez avoir besoin de le diviser sur la base de la virgule. Cependant, une fois que vous l'avez divisé, vous n'avez qu'à appliquer le code indiqué précédemment.

4
répondu rjzii 2017-05-23 12:26:20

CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("mon nom");

retourne ~ mon nom

mais le problème existe toujours avec des noms comme McFly comme indiqué précédemment.

3
répondu David C 2008-09-16 14:27:52

j'utilise ma propre méthode pour obtenir ce fixe:

par exemple la phrase:" hello world. bonjour c'est la stackoverflow monde."Bonjour tout le Monde. Bonjour C'Est La Stackoverflow Monde.". Regex \b (début d'un mot) \w (premier caractère du mot) fera l'affaire.

/// <summary>
/// Makes each first letter of a word uppercase. The rest will be lowercase
/// </summary>
/// <param name="Phrase"></param>
/// <returns></returns>
public static string FormatWordsWithFirstCapital(string Phrase)
{
     MatchCollection Matches = Regex.Matches(Phrase, "\b\w");
     Phrase = Phrase.ToLower();
     foreach (Match Match in Matches)
         Phrase = Phrase.Remove(Match.Index, 1).Insert(Match.Index, Match.Value.ToUpper());

     return Phrase;
}
3
répondu Ton Snoei 2011-01-21 13:10:20

les suggestions pour utiliser ToTitleCase ne fonctionneront pas pour les chaînes qui sont toutes en majuscules. Donc vous allez devoir appeler ToUpper sur le premier char et ToLower sur les personnages restants.

2
répondu Tundey 2008-09-16 15:37:53

cette classe fait l'affaire. Vous pouvez ajouter de nouveaux préfixes au tableau de chaînes de caractères statiques _prefixes .

public static class StringExtensions
{
        public static string ToProperCase( this string original )
        {
            if( String.IsNullOrEmpty( original ) )
                return original;

            string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
            return result;
        }

        public static string WordToProperCase( this string word )
        {
            if( String.IsNullOrEmpty( word ) )
                return word;

            if( word.Length > 1 )
                return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 );

            return word.ToUpper( CultureInfo.CurrentCulture );
        }

        private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );
        private static readonly string[] _prefixes = {
                                                         "mc"
                                                     };

        private static string HandleWord( Match m )
        {
            string word = m.Groups[1].Value;

            foreach( string prefix in _prefixes )
            {
                if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
                    return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase();
            }

            return word.WordToProperCase();
        }
}
2
répondu Eddie Velasquez 2008-09-16 16:06:45

si vous utilisez vS2k8, vous pouvez utiliser une méthode d'extension pour l'ajouter à la classe String:

public static string FirstLetterToUpper(this String input)
{
    return input = input.Substring(0, 1).ToUpper() + 
       input.Substring(1, input.Length - 1);
}
1
répondu FlySwat 2008-09-16 14:28:27

pour contourner quelques-uns des problèmes que ben a mis en évidence, je suggère de convertir la chaîne en minuscules d'abord, puis d'appeler la méthode ToTitleCase. Vous pouvez alors utiliser IndexOf ("Mc") ou IndexOf ("o\'") pour déterminer les cas spéciaux qui nécessitent une attention plus spécifique.

inputString = inputString.ToLower();
inputString = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(inputString);
int indexOfMc = inputString.IndexOf(" Mc");
if(indexOfMc  > 0)
{
   inputString.Substring(0, indexOfMc + 3) + inputString[indexOfMc + 3].ToString().ToUpper() + inputString.Substring(indexOfMc + 4);
}
0
répondu Andy Rose 2011-04-29 14:34:08

j'aime cette façon:

using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());

supprimé de cet article MSDN .

0
répondu TrentVB 2012-09-13 19:22:18

J'espère que cela vous aidera.

String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);
0
répondu Arun 2013-01-02 11:37:49
 public static string ConvertToCaptilize(string input)
        {
            if (!string.IsNullOrEmpty(input))
            {
                string[] arrUserInput = input.Split(' ');


                // Initialize a string builder object for the output
                StringBuilder sbOutPut = new StringBuilder();


                // Loop thru each character in the string array
                foreach (string str in arrUserInput)
                {
                    if (!string.IsNullOrEmpty(str))
                    {
                        var charArray = str.ToCharArray();
                        int k = 0;
                        foreach (var cr in charArray)
                        {
                            char c;
                            c = k == 0 ? char.ToUpper(cr) : char.ToLower(cr);
                            sbOutPut.Append(c);
                            k++;
                        }


                    }
                    sbOutPut.Append(" ");
                }
                return sbOutPut.ToString();
            }
            return string.Empty;

        }
0
répondu Govind Singh Rawat 2016-11-30 07:46:30

comme GDE indiqué, vous aurez besoin d'un algorithme plus complexe pour traiter les noms spéciaux (c'est probablement pourquoi de nombreux endroits forcent tout à la majuscule).

quelque chose comme CE c non testé devrait traiter le cas simple que vous avez demandé:

public string SentenceCase(string input)
{
    return input(0, 1).ToUpper + input.Substring(1).ToLower;
}
-1
répondu Michael Haren 2008-09-16 14:30:35