it-swarm-ru.tech

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

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

139
Mike Roosa

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 для подробного описания.

256
ageektrapped
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
117
Nathan Baulch
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());
30
Ganesan SubbiahPandian

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

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

регулярное выражение также можно использовать \b[a-zA-Z] для определения начального символа Word после границы слова \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
12
polkduran

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
Jamie Ide

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

http://support.Microsoft.com/kb/31289

5
ckal

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

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

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

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

4
rjzii

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

Например, фраза: "Привет, мир. Привет, это мир переполнения стека". будет "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
Ton Snoei

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

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

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

3
David C

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

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();
        }
}
2
Eddie Velasquez

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

2
Tundey

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

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

Чтобы обойти некоторые проблемы, которые были выделены, я бы предложил сначала преобразовать строку в нижний регистр, а затем вызвать метод 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);
}
0
Andy Rose
 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;

        }
0
Govind Singh Rawat

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

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

Снято с этого статья MSDN .

0
TrentVB

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

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