611 votes

Mettre la première lettre d'une chaîne en majuscule (avec une performance maximale)

J'ai un DetailsView avec un TextBox et je veux que le données saisies être toujours sauvé avec la PREMIÈRE LETTRE EN MAJUSCULES.

Exemple :

"red" --> "Red"
"red house" --> " Red house"

Comment puis-je réaliser cela maximiser les performances ?


NOTE :
D'après les réponses et les commentaires sous les réponses, beaucoup de gens pensent que la question porte sur la capitalisation. tous les mots de la chaîne. Par exemple => Red House Ce n'est pas le cas, mais si c'est ce que vous recherchez. cherchez une des réponses qui utilise TextInfo 's ToTitleCase méthode. (NOTE : Ces réponses sont incorrect pour la question réellement posée).
Voir TextInfo.ToTitleCase doc pour les avertissements (ne touche pas les mots en majuscules - ils sont considérés comme des acronymes ; peut mettre en minuscules les lettres au milieu de mots qui ne devraient pas l'être, par exemple "McDonald" => "Mcdonald" ; il n'est pas garanti qu'il gère toutes les subtilités spécifiques aux cultures concernant les règles de capitalisation).


NOTE :
La question est ambiguë quant à savoir si les lettres après la première doivent être forcé à minuscule . La réponse acceptée suppose que seule la première lettre doit être modifiée . Si vous voulez forcer toutes les lettres de la chaîne sauf la première pour être en minuscules, cherchez une réponse contenant ToLower et ne contenant pas de ToTitleCase .

10 votes

@Bobby : Ce n'est pas un doublon : le PO demande de mettre la première lettre d'une chaîne en majuscule, la question dans le lien met la première lettre de chaque mot en majuscule.

2 votes

@GvS : La première réponse est très détaillé et le premier bloc de code est exactement ce qu'il recherche. De même, entre mettre une majuscule à chaque mot et seulement au premier mot, il n'y a qu'une seule boucle de différence.

0 votes

Avez-vous réussi à résoudre ce problème ? Avez-vous encore besoin d'aide à ce sujet ?

804voto

Carlos Muñoz Points 6208

Mise à jour vers C# 8

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input) =>
        input switch
        {
            null => throw new ArgumentNullException(nameof(input)),
            "" => throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input)),
            _ => input.First().ToString().ToUpper() + input.Substring(1)
        };
}

C# 7

public static class StringExtensions
{
    public static string FirstCharToUpper(this string input)
    {
        switch (input)
        {
            case null: throw new ArgumentNullException(nameof(input));
            case "": throw new ArgumentException($"{nameof(input)} cannot be empty", nameof(input));
            default: return input.First().ToString().ToUpper() + input.Substring(1);
        }
    }
}

Des réponses très anciennes

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + String.Join("", input.Skip(1));
}

EDIT : Cette version est plus courte. Pour une solution plus rapide, consultez La réponse d'Equiso

public static string FirstCharToUpper(string input)
{
    if (String.IsNullOrEmpty(input))
        throw new ArgumentException("ARGH!");
    return input.First().ToString().ToUpper() + input.Substring(1);
}

EDIT 2 : La solution la plus rapide est probablement Darren (Il y a même un point de repère) bien que je changerais le nom de l'entreprise. string.IsNullOrEmpty(s) validation pour lever une exception puisque l'exigence originale prévoit l'existence d'une première lettre afin qu'elle puisse être mise en majuscule. Notez que ce code fonctionne pour une chaîne de caractères générique et pas particulièrement sur les valeurs valides de l'option Textbox .

0 votes

Pourquoi pas ? return String.Join(input.First().ToString().ToUpper(), input.Skip(1)); si vous allez utiliser String.Join en premier lieu.

2 votes

Parce que le premier paramètre de String.Join est le séparateur avec lequel on joint les chaînes de caractères données avec le deuxième paramètre.

36 votes

J'aime beaucoup votre réponse, mais var arr = input.ToCharArray(); arr[0] = Char.ToUpperInvariant(arr[0]); return new String(arr); gagnerait probablement un peu de vitesse puisque vous créez moins d'objets immuables (et surtout vous sautez l'étape du String.Join ). Cela dépend bien sûr de la longueur de la chaîne.

395voto

Equiso Points 4026
public string FirstLetterToUpper(string str)
{
    if (str == null)
        return null;

    if (str.Length > 1)
        return char.ToUpper(str[0]) + str.Substring(1);

    return str.ToUpper();
}

Ancienne réponse : Cela fait passer toutes les premières lettres en majuscules

public string ToTitleCase(string str)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}

0 votes

Mais cela convertit toutes les premières lettres d'un mot en majuscules, et pas seulement le premier caractère d'une chaîne.

0 votes

@GvS, c'est ce que la question vous demande de faire.

25 votes

Il demande "maison rouge" => "maison rouge". ToTitleCase vous donnera "Red House".

53voto

Vous pouvez utiliser la méthode "ToTitleCase".

string s = new CultureInfo("en-US").TextInfo.ToTitleCase("red house");
//result : Red House

cette méthode d'extension résout tous les problèmes de titulature.

facile à utiliser

string str = "red house";
str.ToTitleCase();
//result : Red house

string str = "red house";
str.ToTitleCase(TitleCase.All);
//result : Red House

la méthode Extention

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;

namespace Test
{
    public static class StringHelper
    {
        private static CultureInfo ci = new CultureInfo("en-US");
        //Convert all first latter
        public static string ToTitleCase(this string str)
        {
            str = str.ToLower();
            var strArray = str.Split(' ');
            if (strArray.Length > 1)
            {
                strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                return string.Join(" ", strArray);
            }
            return ci.TextInfo.ToTitleCase(str);
        }
        public static string ToTitleCase(this string str, TitleCase tcase)
        {
            str = str.ToLower();
            switch (tcase)
            {
                case TitleCase.First:
                    var strArray = str.Split(' ');
                    if (strArray.Length > 1)
                    {
                        strArray[0] = ci.TextInfo.ToTitleCase(strArray[0]);
                        return string.Join(" ", strArray);
                    }
                    break;
                case TitleCase.All:
                    return ci.TextInfo.ToTitleCase(str);
                default:
                    break;
            }
            return ci.TextInfo.ToTitleCase(str);
        }
    }

    public enum TitleCase
    {
        First,
        All
    }
}

2 votes

Le problème avec votre solution est que "maison rouge" sera converti en "maison rouge" et non en "maison rouge" comme il était demandé dans la question.

5 votes

@Tacttin Cela fonctionnera mais le code suivant est plus facile à lire et plus performant char.ToUpper(text[0]) + ((text.Length > 1) ? text.Substring(1).ToLower() : string.Empty) ; Vous pouvez en lire davantage @ vkreynin.wordpress.com/2013/10/09/

2 votes

Je n'aime pas cette solution, car elle combine deux situations très différentes en une seule et longue méthode. Je ne vois pas non plus d'avantage conceptuel. Et la mise en œuvre de la capitalisation de la première lettre seulement est ridicule. Si vous voulez capitaliser la première lettre, l'implémentation évidente est la suivante de ne mettre que la première lettre en majuscule (ToUpper) . Au lieu de cela, j'aurais deux méthodes distinctes. FirstLetterToUpper dans la réponse d'Equiso (ou dans la réponse plus récente de Guillernet), et ToTitleCase ici, mais sans le deuxième paramètre. Alors pas besoin de enum TitleCase .

39voto

Kobi Points 65357

Pour la première lettre, avec contrôle des erreurs :

public string CapitalizeFirstLetter(string s)
{
    if (String.IsNullOrEmpty(s))
        return s;
    if (s.Length == 1)
        return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
}

Et voici la même chose comme une extension pratique

public static string CapitalizeFirstLetter(this string s)
    {
    if (String.IsNullOrEmpty(s)) return s;
    if (s.Length == 1) return s.ToUpper();
    return s.Remove(1).ToUpper() + s.Substring(1);
    }

0 votes

Une approche propre. Merci !

13voto

Big T Points 1951
public static string ToInvarianTitleCase(this string self)
{
    if (string.IsNullOrWhiteSpace(self))
    {
        return self;
    }

    return CultureInfo.InvariantCulture.TextInfo.ToTitleCase(self);
}

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