Comment mettre en majuscule le premier caractère de chaque mot, ou le premier caractère d'une chaîne entière, avec C#?




string humanize (5)

Autant que je sache, il n'y a pas moyen de faire cela sans écrire (ou cribbing) du code. C # les filets (ha!) Vous majuscules, minuscules et titres (ce que vous avez):

http://support.microsoft.com/kb/312890/EN-US/

Je pourrais écrire mon propre algorithme pour le faire, mais j'estime qu'il devrait y avoir l'équivalent de Ruby's humanize en C #.

Je l'ai googlé mais je n'ai trouvé que des moyens d'humaniser les dattes.

Exemples:

  • Une façon de transformer "Lorem Lipsum Et" en "Lorem lipsum et"
  • Une façon de transformer "Lorem lipsum et" en "Lorem Lipsum Et"

Il existe une autre solution élégante:

Définir la fonction ToTitleCase dans une classe statique de votre projet

using System.Globalization;

public static string ToTitleCase(this string title)
{
    return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(title.ToLower()); 
}

Et utilisez-le ensuite comme une extension de chaîne n’importe où dans votre projet:

"have a good day !".ToTitleCase() // "Have A Good Day !"

La technique CSS est acceptable mais ne modifie que la présentation de la chaîne dans le navigateur. Une meilleure méthode consiste à mettre le texte lui-même en majuscule avant de l'envoyer au navigateur.

La plupart des implémentations ci-dessus sont correctes, mais aucune d'entre elles n'aborde la question de savoir ce qui se passe si vous avez des mots de casse à conserver, ou si vous souhaitez utiliser une casse de titre vraie, par exemple:

"Où étudier les cours de doctorat aux États-Unis"

ou

"Formulaire IRS UB40a"

Également utiliser CultureInfo.CurrentCulture.TextInfo.ToTitleCase (chaîne) conserve les mots en majuscule, comme dans "sports et baseball MLB", qui devient "Sports et MLB Baseball", mais si la chaîne entière est placée en majuscule, un problème se produit.

J'ai donc créé une fonction simple qui vous permet de conserver les mots majuscules et minuscules et de transformer les petits mots en minuscules (s'ils ne sont pas au début et à la fin de la phrase) en les incluant dans un tableau de chaînes specialCases et lowerCases:

public static string TitleCase(string value) {
        string titleString = ""; // destination string, this will be returned by function
        if (!String.IsNullOrEmpty(value)) {
            string[] lowerCases = new string[12] { "of", "the", "in", "a", "an", "to", "and", "at", "from", "by", "on", "or"}; // list of lower case words that should only be capitalised at start and end of title
            string[] specialCases = new string[7] { "UK", "USA", "IRS", "UCLA", "PHd", "UB40a", "MSc" }; // list of words that need capitalisation preserved at any point in title
            string[] words = value.ToLower().Split(' ');
            bool wordAdded = false; // flag to confirm whether this word appears in special case list
            int counter = 1;
            foreach (string s in words) {

                // check if word appears in lower case list
                foreach (string lcWord in lowerCases) {
                    if (s.ToLower() == lcWord) {
                        // if lower case word is the first or last word of the title then it still needs capital so skip this bit.
                        if (counter == 0 || counter == words.Length) { break; };
                        titleString += lcWord;
                        wordAdded = true;
                        break;
                    }
                }

                // check if word appears in special case list
                foreach (string scWord in specialCases) {
                    if (s.ToUpper() == scWord.ToUpper()) {
                        titleString += scWord;
                        wordAdded = true;
                        break;
                    }
                }

                if (!wordAdded) { // word does not appear in special cases or lower cases, so capitalise first letter and add to destination string
                    titleString += char.ToUpper(s[0]) + s.Substring(1).ToLower();
                }
                wordAdded = false;

                if (counter < words.Length) {
                    titleString += " "; //dont forget to add spaces back in again!
                }
                counter++;
            }
        }
        return titleString;
    }

Ceci est juste une méthode simple et rapide - et peut probablement être améliorée si vous voulez passer plus de temps dessus.

si vous souhaitez conserver la capitalisation de mots plus petits tels que "un" et "de", supprimez-les simplement du tableau de chaînes des cas spéciaux. Différentes organisations ont des règles différentes sur la capitalisation.

Vous pouvez voir un exemple de ce code en action sur ce site: Egg Donation London - ce site crée automatiquement des pistes de navigation en haut des pages en analysant l'URL, par exemple "/ services / uk-egg-bank / introduction" - puis chaque Le nom du dossier dans la trace a des traits d'union remplacés par des espaces et met le nom du dossier en majuscule, ainsi uk-egg-bank devient UK Egg Bank. (en préservant les majuscules 'UK')

Une extension de ce code pourrait consister en une table de recherche composée d’acronymes et de mots majuscules / minuscules dans un fichier texte partagé, une table de base de données ou un service Web, de sorte que la liste des mots de casse mélangés puisse être gérée à partir d’un seul endroit et appliquée à de nombreux types différents. applications qui s'appuient sur la fonction.


Si vous voulez juste mettre le premier caractère en majuscule, collez-le simplement dans votre propre méthode utilitaire:

return string.IsNullOrEmpty(str) 
    ? str
    : str[0].ToUpperInvariant() + str.Substring(1).ToLowerInvariant();

Il existe également une méthode de bibliothèque pour capitaliser le premier caractère de chaque mot:

TextInfo.ToTitleCase


Comme indiqué dans les commentaires de la réponse de @ miguel , vous pouvez utiliser TextInfo.ToTitleCase disponible depuis .NET 1.1. Voici du code correspondant à votre exemple:

string lipsum1 = "Lorem lipsum et";

// Creates a TextInfo based on the "en-US" culture.
TextInfo textInfo = new CultureInfo("en-US",false).TextInfo;

// Changes a string to titlecase.
Console.WriteLine("\"{0}\" to titlecase: {1}", 
                  lipsum1, 
                  textInfo.ToTitleCase( lipsum1 )); 

// Will output: "Lorem lipsum et" to titlecase: Lorem Lipsum Et

Il ignorera les majuscules telles que "LOREM LIPSUM ET" car il prend en charge les cas où les acronymes sont dans le texte (pour que " NAMBLA " ne devienne pas "nambla" ou "nambla").

Toutefois, si vous souhaitez uniquement mettre en majuscule le premier caractère, vous pouvez utiliser la solution proposée here … ou vous pouvez simplement scinder la chaîne et mettre en majuscule la première dans la liste:

string lipsum2 = "Lorem Lipsum Et";

string lipsum2lower = textInfo.ToLower(lipsum2);

string[] lipsum2split = lipsum2lower.Split(' ');

bool first = true;

foreach (string s in lipsum2split)
{
    if (first)
    {
        Console.Write("{0} ", textInfo.ToTitleCase(s));
        first = false;
    }
    else
    {
        Console.Write("{0} ", s);
    }
}

// Will output: Lorem lipsum et 




humanize