web-dev-qa-db-fra.com

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

Je pourrais écrire mon propre algorithme pour le faire, mais je pense qu'il devrait y avoir l'équivalent de humanisation de Ruby en C #.

Je l'ai cherché sur Google, 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"
57
marcgg

Comme discuté dans les commentaires de @ la réponse de miguel , vous pouvez utiliser TextInfo.ToTitleCase qui est disponible depuis .NET 1.1. Voici un 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 casse qui sont toutes des majuscules comme "LOREM LIPSUM ET" car il s'occupe des cas si les acronymes sont dans le texte (de sorte que " NAMBLA "ne deviendra pas" nambla "ou" Nambla ").

Cependant, si vous souhaitez uniquement mettre en majuscule le premier caractère, vous pouvez faire la solution qui est terminée ici … ou vous pouvez simplement diviser la chaîne et mettre en majuscule le premier de 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 
112
Spoike

Utilisez des expressions régulières car cela semble beaucoup plus propre:

string s = "the quick brown fox jumps over the lazy dog";
s = Regex.Replace(s, @"(^\w)|(\s\w)", m => m.Value.ToUpper());
31
Xela

Il existe une autre solution élégante:

Définissez 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 puis utilisez-le comme une extension de chaîne n'importe où sur votre projet:

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

Si vous souhaitez simplement mettre en majuscule le premier caractère, collez-le simplement dans une méthode utilitaire de votre choix:

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

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

http://msdn.Microsoft.com/en-us/library/system.globalization.textinfo.totitlecase.aspx

2
Daniel Earwicker

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

La plupart des implémentations ci-dessus sont correctes, mais aucune d'entre elles ne résout le problème de ce qui se passe si vous avez des mots à casse mixte qui doivent être conservés, ou si vous souhaitez utiliser une véritable casse de titre, par exemple:

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

ou

"Formulaire IRS UB40a"

L'utilisation de CultureInfo.CurrentCulture.TextInfo.ToTitleCase (chaîne) préserve également les mots majuscules comme dans "sports et baseball MLB" qui devient "Sports et baseball MLB" mais si la chaîne entière est mise en majuscules, cela provoque un problème.

J'ai donc mis en place une fonction simple qui vous permet de conserver les mots en majuscules et en minuscules et de faire des 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;
    }

C'est juste une méthode simple et rapide - et peut probablement être un peu améliorée si vous voulez y passer plus de temps.

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

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 "- alors chaque nom de dossier dans la piste a des tirets remplacés par des espaces et met en majuscule le nom du dossier, donc uk-Egg-bank devient UK Egg Bank. (en préservant les majuscules 'UK')

Une extension de ce code pourrait être d'avoir une table de recherche des acronymes et des mots en majuscules/minuscules dans un fichier texte partagé, une table de base de données ou un service Web afin que la liste des mots en casse mixte puisse être conservée à partir d'un seul endroit et s'appliquer à de nombreux différents applications qui dépendent de la fonction.

1
Myke Black

Il n'y a pas de solution prédéfinie pour une captialisation linguistique appropriée dans .NET. Quel genre de capitialisation allez-vous faire? Suivez-vous les conventions du Chicago Manual of Style? AMA ou MLA? Même la mise en majuscule des phrases en anglais a des milliers d'exceptions spéciales pour les mots. Je ne peux pas parler de ce que Ruby humanise, mais j'imagine qu'il ne suit probablement pas les règles linguistiques de capitalisation et fait plutôt quelque chose de beaucoup plus simple.

En interne, nous avons rencontré ce même problème et avons dû écrire un code de montant assez important juste pour gérer la casse appropriée (dans notre petit monde) des titres d'articles, sans même tenir compte de la capitalisation des phrases. Et ça devient "flou" :)

Cela dépend vraiment de ce dont vous avez besoin - pourquoi essayez-vous de convertir les phrases en capitalisation appropriée (et dans quel contexte)?

0
patjbs

Tous les exemples semblent faire baisser les autres personnages en premier, ce qui n'est pas ce dont j'avais besoin.

customerName = CustomerName <- C'est ce que je voulais

this is an example = This Is An Example

public static string ToUpperEveryWord(this string s)
{
    // Check for empty string.  
    if (string.IsNullOrEmpty(s))
    {
        return string.Empty;
    }

    var words = s.Split(' ');

    var t = "";
    foreach (var Word in words)
    {
        t += char.ToUpper(Word[0]) + Word.Substring(1) + ' ';
    }
    return t.Trim();
}
0
Demodave

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

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

0
vinny