Existe-t-il un moyen simple de mettre en majuscule la première lettre d'une chaîne et de réduire le reste? Existe-t-il une méthode intégrée ou dois-je créer la mienne?
c#
string
capitalize
Mike Roosa
la source
la source
Réponses:
TextInfo.ToTitleCase()
met en majuscule le premier caractère de chaque jeton d'une chaîne.S'il n'est pas nécessaire de conserver l'acronyme en majuscules, vous devez inclure
ToLower()
.Si CurrentCulture n'est pas disponible, utilisez:
Voir le lien MSDN pour une description détaillée.
la source
la source
sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
CurrentCulture
, comment pouvons-nous être sûrs qu'il n'y a pas de culture qui gère cela différemment?Le code ci-dessus ne fonctionnera pas .....
alors mettez le code ci-dessous en convertissant en bas puis appliquez la fonction
la source
Certains cas
CultureInfo.CurrentCulture.TextInfo.ToTitleCase
ne peuvent pas gérer, par exemple: l'apostrophe'
.Une regex peut également être utilisée
\b[a-zA-Z]
pour identifier le caractère de départ d'un mot après une limite de mot\b
, il suffit alors de remplacer la correspondance par son équivalence en majuscules grâce à laRegex.Replace(string input,string pattern,MatchEvaluator evaluator)
méthode:Le regex peut être ajusté si nécessaire, par exemple, si nous voulons gérer les cas
MacDonald
etMcFry
, le regex devient:(?<=\b(?:mc|mac)?)[a-zA-Z]
Si nous devons gérer plusieurs préfixes nous ne devons modifier le groupe
(?:mc|mac)
, par exemple pour ajouter des préfixes françaisdu, de
:(?:mc|mac|du|de)
.Enfin, nous pouvons réaliser que cette expression régulière correspondra également à la casse
MacDonald'S
de la dernière's
, nous devons donc la gérer dans l' expression régulière avec un regard négatif derrière(?<!'s\b)
. À la fin, nous avons:la source
\b[ivxlcdm]+$|
c'est ainsi\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)
. Il mettra en majuscules tous les mots de fin d'un nom ayant un format de chiffres romains non strict (ivxlcdm
). Vous pouvez cependant avoir des résultats indésirables, par exemple 'Li' deviendra 'LI'Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
Mc et Mac sont des préfixes de nom de famille courants aux États-Unis, et il y en a d'autres. TextInfo.ToTitleCase ne gère pas ces cas et ne doit pas être utilisé à cette fin. Voici comment je fais:
la source
ToTitleCase () devrait fonctionner pour vous.
http://support.microsoft.com/kb/312890
la source
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 edg l'a souligné, il y a certains noms pour lesquels cela ne fonctionnera pas, mais ils sont assez rares, donc à moins que vous ne cibliez une culture où de tels noms sont courants, il n'est pas nécessaire de vous inquiéter trop.
Cependant, si vous ne travaillez pas avec une langue .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, vous pouvez simplement mettre en majuscule la première lettre en bas du reste en utilisant sous-chaînes.
Cependant, si plusieurs noms vous sont fournis dans la même chaîne, vous devez savoir comment vous obtenez les informations et les diviser en conséquence. Donc, si vous obtenez un nom comme "John Doe", vous divisez la chaîne en fonction du caractère d'espace. S'il est dans un format tel que "Doe, John", vous devrez le diviser en fonction de la virgule. Cependant, une fois que vous l'avez séparé, appliquez simplement le code indiqué précédemment.
la source
CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("mon nom");
renvoie ~ Mon nom
Mais le problème existe toujours avec des noms comme McFly comme indiqué précédemment.
la source
J'utilise ma propre méthode pour résoudre ce problème:
Par exemple, la phrase: "bonjour le monde. Bonjour c'est le monde stackoverflow." sera "Hello World. Hello This Is The Stackoverflow World.". Regex \ b (début d'un mot) \ w (premier caractère du mot) fera l'affaire.
la source
Les suggestions d'utilisation de ToTitleCase ne fonctionneront pas pour les chaînes qui sont toutes en majuscules. Vous devrez donc appeler ToUpper sur le premier caractère et ToLower sur les caractères restants.
la source
Cette classe fait l'affaire. Vous pouvez ajouter de nouveaux préfixes au tableau de chaînes statiques _prefixes .
la source
Si vous utilisez vS2k8, vous pouvez utiliser une méthode d'extension pour l'ajouter à la classe String:
la source
Char.ToUpper(input[0]) + input.Substring(1)
est plus lisible à mon humble avis.input.FirstLetterToUpper()
est certainement plus lisible par rapportChar.ToUpper(input[0]) + input.Substring(1)
, mais moins transparentePour contourner certains des problèmes / problèmes qui ont été mis en évidence, je suggérerais de convertir d'abord la chaîne en minuscules, puis d'appeler la méthode ToTitleCase. Vous pouvez ensuite utiliser IndexOf ("Mc") ou IndexOf ("O \ '") pour déterminer les cas spéciaux qui nécessitent une attention plus spécifique.
la source
J'aime cette façon:
Tiré de cet article MSDN .
la source
J'espère que cela vous aide.
la source
la source
Comme indiqué par edg, vous aurez besoin d'un algorithme plus complexe pour gérer les noms spéciaux (c'est probablement pourquoi de nombreux endroits forcent tout en majuscules).
Quelque chose comme ce c # non testé devrait gérer le cas simple que vous avez demandé:
la source