C #에서 성과 이름의 첫 글자는 어떻게 대문자로 사용합니까?


141

문자열의 첫 글자를 대문자로 바꾸고 나머지를 낮추는 쉬운 방법이 있습니까? 내장 된 방법이 있습니까, 아니면 직접 만들어야합니까?


3
특정 응용 프로그램에 대해서는 아무것도 모르지만 일반적인 경고가 필요하다고 생각합니다. 프로그래머는이 방법을 실명에 적용하지 않아야합니다. 나는 존 맥도날드가 자신의 이름을 뒤덮고있는이 방법을 화나게 할 것이라고 생각한다. 등 등. 대부분의 이름은 대문자로 된 "First Last"형식이 아니며 대문자로 표시됩니다. 나는 kalzumeus.com/2010/06/17/…를
Nick

@Nick은 절대적으로 맞습니다. 소문자와 대문자가 잘못되었다고 가정조차 할 수 없습니다. 아일랜드어 이름은 "Ó hAirt"와 같은 것을합니다. 당신이 머리 위로 생각할 수있는 모든 컨벤션에 대해 당신을 놀라게 할 문화 / 언어가 있다고 가정하십시오.
제임스 무어

답변:


259

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 링크 를 참조하십시오 .


24
여기서 주목해야 할 것은 문자열이 모두 대문자이면 작동하지 않는다는 것입니다. 모든 대문자가 약어라고 생각합니다.
Mike Roosa

9
내가 이것들 중 많은 것들에서 본 것은 당신이 그것들에 의존 할 수 없다는 것입니다. 이름이 McCain과 같거나 더 많은 외국 이름을 치기 시작하면 작동하지 않습니다.
Mike Wills

25
@roosa-ToTitleCase (val.ToLower ())에 대한 쉬운 수정
Simon_Weaver

+1 나는 그것이 이미 FCL에 있어야한다는 것을 알고 있었고 구글은 나를 여기로 데려왔다. = D
기드온

13
아래의 Nathan의 답변과 달리 "정적이 아닌 필드, 메서드 또는 속성에는 개체 참조가 필요합니다."라는 오류가 발생합니다.
Dan W

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

앗 스냅! 좋은 대답입니다. 나는 항상 세계화에 대해 잊어 버립니다.
Michael Haren

훌륭한 솔루션! VB.Net에서 :sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
Nasenbaer

현재 문화권이 아닌 각 개인 이름 의 문화권을 감지해야합니다 . 이름에는 작동하지 않습니다.
제임스 무어

1
이것이에 의존하기 때문에 이것을 CurrentCulture다르게 다루는 문화가 없다는 것을 어떻게 확신 할 수 있습니까?
Rudey

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

15

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]단어 경계 후 단어의 시작 문자를 식별하기 위해 \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정규식이 될 경우를 :(?<=\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

@polkduran 이름 끝에 로마 숫자를 다루는 방법을 찾기 위해 고심하고 있습니다. 나는 모두 대문자로 만들고 싶습니다 : John Smith III. 부정적인 외모가 이것을 방해합니까?
Matt

평소대로, 나는 마침내 내 자신의 질문에 대답 할 수있었습니다. 로마 숫자와 일치하도록 선택적 그룹을 추가했습니다 (대문자로 표시됨). 다음은 지금 사용하고있는 정규 표현식입니다. (? <= \ b (? : mc | mac)?) [a-zA-Z] (? <! 's \ b) (?: ii | iii | iv | v | vi | vii | viii | ix)?
Matt

귀하의 경우는 특별한 경우이며, 답변의 정규 표현식은 각 이름 (성)을 입력 문자열 (테스트 입력 문자열에 여러 이름이 있음)에서 분리 된 단어로 취급하므로 '이름 끝'이라는 개념이 없습니다. . 입력 문자열을 단일 이름으로 취급하면 정규식 앞에 간단한 조건을 접어 사례를 처리 \b[ivxlcdm]+$|할 수 있습니다 \b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b). 로마 숫자 형식이 엄격하지 않은 이름의 모든 끝 단어를 대문자로 만듭니다 ( ivxlcdm). 예를 들어 'Li'는 'LI'가됩니다.
polkduran

흥미 롭군 나는 당신의 추가가 아마도 구조와 관련하여 더 정확하다고 생각하지만, 나는 동의합니다 ... 당신이 언급 한 몇 가지 문제가있을 것이라고 생각합니다. 위의 솔루션에서 접미사를 "ix"까지 하드 코딩하여 내 경우에는 효과가 있지만 모든 사람에게 적합하지 않을 수도 있습니다.
Matt

1
@ Si8, 테스트 해봤 어? Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
polkduran

7

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


4

가장 직접적인 옵션은 .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"과 같은 형식 인 경우 쉼표를 기준으로 분할해야합니다. 그러나 일단 분할하면 이전에 표시된 코드 만 적용하면됩니다.


3

CultureInfo.CurrentCulture.TextInfo.ToTitleCase ( "내 이름");

~ 내 이름을 반환

그러나 앞에서 언급 한 것처럼 McFly와 같은 이름에는 여전히 문제가 있습니다.


3
맥 프리! Koichiwa, Fugitsu-san
Ian Boyd

@David C 공백을 널로 바꾸십시오! like string.replace ( '', '')
Chintan

3

이 문제를 해결하기 위해 내 자신의 방법을 사용합니다.

예를 들어 "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;
}

2

ToTitleCase 사용 제안은 모두 대문자 인 문자열에는 작동하지 않습니다. 따라서 첫 번째 문자에서 ToUpper를 호출하고 나머지 문자에서 ToLower를 호출해야합니다.


6
ToTitleCase를 호출하기 전에 입력 문자열에서 ToLower를 호출하지 않는 이유는 무엇입니까?
Andy Rose

2

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

1

vS2k8을 사용하는 경우 확장 메서드를 사용하여 String 클래스에 추가 할 수 있습니다.

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

9
Char.ToUpper(input[0]) + input.Substring(1)더 읽기 쉬운 IMHO입니다.
Hosam Aly

이럴 input.FirstLetterToUpper()확실히 더 읽을Char.ToUpper(input[0]) + input.Substring(1),하지만 덜 투명
마이클

0

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

나는이 방법을 좋아한다 :

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

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

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

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

        }

-1

edg가 지적했듯이, 특별한 이름을 다루기 위해서는 더 복잡한 알고리즘이 필요합니다 (이것은 아마도 많은 곳이 모든 것을 대문자로 강제하는 이유 일 것입니다).

테스트되지 않은이 C #과 같은 것은 요청한 간단한 경우를 처리해야합니다.

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

이 잊어 버려 - 세계화 클래스 사용 stackoverflow.com/questions/72831/...
마이클 하렌
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.