Как использовать первую букву имени и фамилии в С#?

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

Ответ 1

TextInfo.ToTitleCase() использует первый символ в каждом знаке строки. Если нет необходимости поддерживать Акроним Uppercasing, тогда вы должны включить 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.

Ответ 2

CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");

Ответ 3

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());

Ответ 4

Есть некоторые случаи, которые 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

Ответ 5

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;
    }

Ответ 7

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

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

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

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

Ответ 8

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

возвращает ~ My Name

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

Ответ 9

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

Например, фраза: "hello world. hello this is the stackoverflow world". будет "Hello World. Hello This Is The Stackoverflow World". 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;
}

Ответ 10

Предложения по использованию ToTitleCase не будут работать для строк, которые являются верхними. Таким образом, вам нужно будет вызвать ToUpper для первых char и ToLower для остальных символов.

Ответ 11

Этот класс делает трюк. Вы можете добавить новые префиксы в статический массив строк _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();
        }
}

Ответ 12

Если вы используете vS2k8, вы можете использовать метод расширения, чтобы добавить его в класс String:

public static string FirstLetterToUpper(this String input)
{
    return input = input.Substring(0, 1).ToUpper() + 
       input.Substring(1, input.Length - 1);
}

Ответ 13

Чтобы обойти некоторые проблемы/проблемы, которые были выделены ben, я бы предложил сначала преобразовать строку в нижний регистр, а затем вызвать метод ToTitleCase. Затем вы можете использовать IndexOf ( "Mc" ) или IndexOf ( "O \" ) для определения особых случаев, требующих особого внимания.

inputString = inputString.ToLower();
inputString = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(inputString);
int indexOfMc = inputString.IndexOf(" Mc");
if(indexOfMc  > 0)
{
   inputString.Substring(0, indexOfMc + 3) + inputString[indexOfMc + 3].ToString().ToUpper() + inputString.Substring(indexOfMc + 4);
}

Ответ 14

Мне нравится этот путь:

using System.Globalization;
...
TextInfo myTi = new CultureInfo("en-Us",false).TextInfo;
string raw = "THIS IS ALL CAPS";
string firstCapOnly = myTi.ToTitleCase(raw.ToLower());

Поднят из этой статьи MSDN.

Ответ 15

Надеюсь, это поможет вам.

String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);

Ответ 16

 public static string ConvertToCaptilize(string input)
        {
            if (!string.IsNullOrEmpty(input))
            {
                string[] arrUserInput = input.Split(' ');


                // Initialize a string builder object for the output
                StringBuilder sbOutPut = new StringBuilder();


                // Loop thru each character in the string array
                foreach (string str in arrUserInput)
                {
                    if (!string.IsNullOrEmpty(str))
                    {
                        var charArray = str.ToCharArray();
                        int k = 0;
                        foreach (var cr in charArray)
                        {
                            char c;
                            c = k == 0 ? char.ToUpper(cr) : char.ToLower(cr);
                            sbOutPut.Append(c);
                            k++;
                        }


                    }
                    sbOutPut.Append(" ");
                }
                return sbOutPut.ToString();
            }
            return string.Empty;

        }

Ответ 17

Как указано edg, вам понадобится более сложный алгоритм для обработки специальных имен (вероятно, поэтому многие места заставляют все в верхнем регистре).

Что-то вроде этого непроверенного С# должно обрабатывать простой случай, который вы запросили:

public string SentenceCase(string input)
{
    return input(0, 1).ToUpper + input.Substring(1).ToLower;
}