it-swarm-ko.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 를 참조하십시오.

257
ageektrapped
CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
118
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

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

예를 들어, MacDonaldMcFry 사례를 처리하려는 경우 regex를 조정할 수 있습니다. (?<=\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) 그룹 만 수정하면됩니다.

마지막으로,이 regex는 마지막 MacDonald'S의 경우 's 와도 일치하므로 regex에서 처리해야합니다. (?<!'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
14
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

가장 직접적인 옵션은 .NET에서 사용할 수있는 ToTitleCase 함수를 사용하는 것입니다. 대부분의 경우 이름을 처리해야합니다. edg 지적했듯이 일부 이름은 효과가 없지만, 거의 드물기 때문에 그러한 이름이 일반적인 문화를 타겟팅하지 않으면 걱정할 필요가 없습니다. 많은.

그러나 .NET 언어로 작업하지 않는 경우 입력 모양에 따라 달라집니다. 이름과성에 대해 두 개의 별도 필드가있는 경우 첫 번째 문자를 대문자로 사용하여 나머지를 낮출 수 있습니다 부분 문자열.

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

그러나 동일한 문자열의 일부로 여러 이름이 제공되는 경우 정보를 얻는 방법을 알아야하며 그에 따라 분할 이 필요합니다. "John Doe"와 같은 이름을 얻으면 공백 문자를 기준으로 문자열을 분할합니다. "Doe, John"과 같은 형식 인 경우 쉼표를 기준으로 분할해야합니다. 그러나 일단 분할하면 이전에 표시된 코드 만 적용하면됩니다.

4
rjzii

이 문제를 해결하려면 내 자신의 방법을 사용하십시오.

예를 들어 다음과 같습니다. "hello world. hello this is a stackoverflow world." "Hello World. Hello This is The Stackoverflow World"입니다. 정규식\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

이 수업은 트릭을 수행합니다. _ 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();
        }
}
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

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);
}
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 article .

0
TrentVB

이것이 도움이되기를 바랍니다.

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