Как мне прописать первую букву имени и фамилии в C #? - PullRequest
139 голосов
/ 16 сентября 2008

Есть ли простой способ сделать заглавной первую букву строки и опустить ее? Есть ли встроенный метод или мне нужно сделать свой собственный?

Ответы [ 17 ]

256 голосов
/ 16 сентября 2008

TextInfo.ToTitleCase() заглавные буквы первого символа в каждом токене строки.
Если нет необходимости использовать верхний регистр аббревиатуры, вам следует включить ToLower().

string s = "JOHN DOE";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
// Produces "John Doe"

Если CurrentCulture недоступен, используйте:

string s = "JOHN DOE";
s = new System.Globalization.CultureInfo("en-US", false).TextInfo.ToTitleCase(s.ToLower());

См. MSDN Link для подробного описания.

117 голосов
/ 16 сентября 2008
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
30 голосов
/ 03 июля 2010
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);

Приведенный выше код не будет работать .....

, поэтому поместите приведенный ниже код путем преобразования в нижнее значение, затем примените функцию

String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());
12 голосов
/ 22 октября 2013

В некоторых случаях CultureInfo.CurrentCulture.TextInfo.ToTitleCase не может быть обработан, например: апостроф '.

string input = CultureInfo.CurrentCulture.TextInfo.ToTitleCase("o'reilly, m'grego, d'angelo");
// input = O'reilly, M'grego, D'angelo

A regex также можно использовать \b[a-zA-Z] для определения начального символа слова после границы слова \b, тогда нам нужно просто заменить совпадение его эквивалентностью в верхнем регистре благодаря Regex.Replace(string input,string pattern,MatchEvaluator evaluator) метод:

string input = "o'reilly, m'grego, d'angelo";
input = Regex.Replace(input.ToLower(), @"\b[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo

Регулярное выражение может быть настроено при необходимости, например, если мы хотим обработать случаи MacDonald и McFry, регулярное выражение становится: (?<=\b(?:mc|mac)?)[a-zA-Z]

string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z]", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald'S, McFry

Если нам нужно обработать больше префиксов, нам нужно всего лишь изменить группу (?:mc|mac), например, добавить французские префиксы du, de: (?:mc|mac|du|de).

Наконец, мы можем понять, что это регулярное выражение будет также соответствовать регистру MacDonald'S для последнего 's, поэтому нам нужно обработать его в регулярное выражение с отрицательным взглядом позади (?<!'s\b). В итоге имеем:

string input = "o'reilly, m'grego, d'angelo, macdonald's, mcfry";
input = Regex.Replace(input.ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper());
// input = O'Reilly, M'Grego, D'Angelo, MacDonald's, McFry
7 голосов
/ 16 сентября 2008

Mc и Mac - распространенные префиксы фамилий в США, а также есть и другие. TextInfo.ToTitleCase не обрабатывает эти случаи и не должен использоваться для этой цели. Вот как я это делаю:

    public static string ToTitleCase(string str)
    {
        string result = str;
        if (!string.IsNullOrEmpty(str))
        {
            var words = str.Split(' ');
            for (int index = 0; index < words.Length; index++)
            {
                var s = words[index];
                if (s.Length > 0)
                {
                    words[index] = s[0].ToString().ToUpper() + s.Substring(1);
                }
            }
            result = string.Join(" ", words);
        }
        return result;
    }
5 голосов
/ 16 сентября 2008

ToTitleCase () должен работать для вас.

http://support.microsoft.com/kb/312890

4 голосов
/ 16 сентября 2008

Самым прямым вариантом будет использование функции ToTitleCase , доступной в .NET, которая должна заботиться о названии большую часть времени. Как указывало edg , есть некоторые имена, для которых он не будет работать, но они довольно редки, поэтому, если вы не ориентируетесь на культуру, где такие имена распространены, вам не нужно беспокоиться о том, что вам нужно слишком сильно волноваться о.

Однако, если вы не работаете с языком .NET, то это зависит от того, как выглядит ввод - если у вас есть два отдельных поля для имени и фамилии, то вы можете просто использовать заглавную букву, а нижнюю - остальные. с использованием подстрок.

firstName = firstName.Substring(0, 1).ToUpper() + firstName.Substring(1).ToLower();
lastName = lastName.Substring(0, 1).ToUpper() + lastName.Substring(1).ToLower();

Однако, если вам предоставлено несколько имен как часть одной и той же строки, вам нужно знать, как вы получаете информацию, и разделить ее соответственно. Поэтому, если вы получаете имя типа «Джон Доу», вы разбиваете строку на основе символа пробела. Если он в таком формате, как «Доу, Джон», вам нужно разделить его на основе запятой. Однако, как только вы разберетесь с ним, просто примените код, показанный ранее.

3 голосов
/ 21 января 2011

Я использую свой собственный метод, чтобы исправить это:

Например, фраза: «Привет, мир. Привет, это мир переполнения стека». будет "Hello World. Привет, это мир Stackoverflow." Regex \ b (начало слова) \ w (первый характер слова) сделает свое дело.

/// <summary>
/// Makes each first letter of a word uppercase. The rest will be lowercase
/// </summary>
/// <param name="Phrase"></param>
/// <returns></returns>
public static string FormatWordsWithFirstCapital(string Phrase)
{
     MatchCollection Matches = Regex.Matches(Phrase, "\\b\\w");
     Phrase = Phrase.ToLower();
     foreach (Match Match in Matches)
         Phrase = Phrase.Remove(Match.Index, 1).Insert(Match.Index, Match.Value.ToUpper());

     return Phrase;
}
3 голосов
/ 16 сентября 2008

CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("мое имя");

возвращает ~ Мое имя

Но проблема все еще существует с такими именами, как McFly, как указано ранее.

2 голосов
/ 16 сентября 2008

Этот класс делает свое дело. Вы можете добавить новые префиксы в массив статических строк _prefixes .

public static class StringExtensions
{
        public static string ToProperCase( this string original )
        {
            if( String.IsNullOrEmpty( original ) )
                return original;

            string result = _properNameRx.Replace( original.ToLower( CultureInfo.CurrentCulture ), HandleWord );
            return result;
        }

        public static string WordToProperCase( this string word )
        {
            if( String.IsNullOrEmpty( word ) )
                return word;

            if( word.Length > 1 )
                return Char.ToUpper( word[0], CultureInfo.CurrentCulture ) + word.Substring( 1 );

            return word.ToUpper( CultureInfo.CurrentCulture );
        }

        private static readonly Regex _properNameRx = new Regex( @"\b(\w+)\b" );
        private static readonly string[] _prefixes = {
                                                         "mc"
                                                     };

        private static string HandleWord( Match m )
        {
            string word = m.Groups[1].Value;

            foreach( string prefix in _prefixes )
            {
                if( word.StartsWith( prefix, StringComparison.CurrentCultureIgnoreCase ) )
                    return prefix.WordToProperCase() + word.Substring( prefix.Length ).WordToProperCase();
            }

            return word.WordToProperCase();
        }
}
...