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? Est-il intégré dans la méthode ou dois-je le faire moi-même?
- Je ne sais rien à propos de votre application particulière, mais je pense qu'un avertissement général qui est à césar: les programmeurs de ne pas appliquer cette méthode, bon gré mal gré à de vrais noms. Je pense que le vieux John MacDonald aurait bouleversé cette méthode de déformation de son nom, pour ne pas mentionner l'e.e. cummings, bell hooks, danah boyd, 松本行弘, les gens avec un "von" dans le nom, les personnes avec le nom "O'Doyle", etc., etc., etc. La plupart des noms ne sont pas au format "prénom" avec des majuscules (et dans capitalisables caractères); je recommande la lecture de kalzumeus.com/2010/06/17/...
- est absolument droit. Vous ne pouvez même pas supposer que la baisse des cas, suivie par la majuscule est faux - noms Irlandais de faire des choses comme "Ó hAirt". Supposons que pour toute autre convention que vous pouvez penser à du haut de votre tête, il y aura une culture/langue qui va vous surprendre.
Vous devez vous connecter pour publier un commentaire.
TextInfo.ToTitleCase()
met en majuscule le premier caractère de chaque jeton d'une chaîne.Si il n'est pas nécessaire de maintenir l'Acronyme Uppercasing, vous devez inclure
ToLower()
.Si CurrentCulture n'est pas disponible, utiliser:
Voir le MSDN Lien pour une description détaillée.
It thinks that all caps is an acronym.
mise en garde. Merci!sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
CurrentCulture
, comment peut-on être sûr qu'il n'y a pas de culture qui le gère différemment?Le code ci-dessus ne fonctionnent pas .....
donc de mettre le code ci-dessous par convertir inférieure à appliquer la fonction
Il existe certains cas qui
CultureInfo.CurrentCulture.TextInfo.ToTitleCase
ne peut pas gérer, par exemple : l'apostrophe'
.Un regex peut également être utilisé
\b[a-zA-Z]
pour identifier le premier caractère d'un mot après une limite de mot\b
, alors nous avons juste besoin de remplacer la partie supérieure du cas de l'équivalence grâce à laRegex.Replace(chaîne de caractères d'entrée,le patron de la chaîne,MatchEvaluator l'évaluateur);
méthode :La regex peut être réglée si nécessaire, par exemple, si nous voulons gérer la
MacDonald
etMcFry
cas, la regex devient :(?<=\b(?:mc|mac)?)[a-zA-Z]
Si nous en avons besoin pour gérer plus de préfixes nous avons seulement besoin de modifier le groupe
(?:mc|mac)
, par exemple pour ajouter des préfixes françaisdu, de
:(?:mc|mac|du|de)
.Enfin, nous pouvons nous rendre compte que cette regex trouvera également le cas
MacDonald'S
pour la dernière'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 :\b[ivxlcdm]+$|
si vous avez\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)
. Il fera upercase tous les mots se terminant d'un nom ayant un pas de stricte chiffre romain format (ivxlcdm
). Vous pouvez avoir cependant quelques résultats indésirables, par exemple 'Li' deviendra 'LI'Mastering Regular Expressions
avant de me sentir à l'aise que j'avais une certaine idée de ce que je faisais. De Plus, il est important d'avoir une compréhension de quand de les appliquer à un problème, car ils peuvent être fragiles si elle est utilisée pour un problème qui a un niveau élevé de flux.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 commun à travers les états-unis, et il en existe d'autres. TextInfo.ToTitleCase ne gère pas les cas et ne doit pas être utilisé à cette fin. Voici comment je le fais:
ToTitleCase() devrait fonctionner pour vous.
http://support.microsoft.com/kb/312890
La plus directe option pour utiliser le ToTitleCase fonction qui est disponible dans .NET qui doit prendre soin de le nom la plupart du temps. Comme edg a souligné il y a quelques noms qu'il ne fonctionnera pas pour, mais elles sont assez rares donc, sauf si vous ciblez une culture où ces noms sont communs, il n'est pas nécessaire que quelque chose que vous avez à vous soucier trop de.
Toutefois, si vous ne travaillez pas avec un .NET language (langue), puis cela dépend de ce que l'entrée ressemble - si vous avez deux champs séparés pour le prénom et le nom, alors vous pouvez simplement mettre en majuscule la première lettre de diminuer le reste à l'aide des sous-chaînes.
Toutefois, si vous êtes fourni de multiples noms comme faisant partie de la même chaîne, alors vous devez savoir comment vous obtenez les informations et 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. Si elle est dans un format tel que "Doe, John", vous allez avoir besoin pour split à partir de la virgule. Cependant, une fois que vous avez divisé à part vous, il suffit d'appliquer le code indiqué précédemment.
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.
- Je utiliser mon propre méthode pour la résolution de ce problème:
Par exemple la phrase: "bonjour tout le monde. bonjour c'est la stackoverflow monde." sera "Bonjour tout le Monde. Bonjour C'Est La Stackoverflow Monde.". Regex \b (début d'un mot) \w (première charactor de la parole) fera l'affaire.
Les suggestions pour utiliser ToTitleCase ne fonctionne pas pour les chaînes qui sont tous en majuscules. Donc, vous allez avoir à appeler ToUpper sur le premier char et ToLower sur les autres personnages.
Cette classe ne comprend le truc. Vous pouvez ajouter de nouveaux préfixes de la _prefixes tableau de chaînes statique.
Si votre aide vS2k8, vous pouvez utiliser une méthode d'extension pour l'ajouter à la classe String:
Char.ToUpper(input[0]) + input.Substring(1)
est plus lisible à mon humble avis.input.FirstLetterToUpper()
est certainement plus lisible vsChar.ToUpper(input[0]) + input.Substring(1)
, mais moins de transparentPour contourner certaines des questions/problèmes qui ont été mis en évidence, je voudrais suggérer la conversion de la chaîne en minuscules d'abord, puis d'appeler la méthode ToTitleCase. Vous pouvez ensuite utiliser IndexOf(" Mc") ou IndexOf(" O\'") afin de déterminer les cas particuliers qui ont besoin d'une attention spécifique.
J'aime cette façon:
Levée de cette Article MSDN.
Espère que cela vous aide.
Comme gde indiqué, vous aurez besoin d'un algorithme plus complexe à gérer des noms spéciaux (c'est sans doute pourquoi de nombreux endroits force tout en majuscules).
Quelque chose comme ça non testé c# doit traiter le cas simple vous avez demandé: