문제

문자열의 첫 글자를 대문자로 쓰고 나머지 글자를 낮추는 쉬운 방법이 있나요?내장된 메소드가 있나요? 아니면 직접 만들어야 하나요?

도움이 되었습니까?

해결책

TextInfo.ToTitleCase() 문자열의 각 토큰에서 첫 번째 문자를 대문자로 표시합니다.
Acronym 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 링크 자세한 설명을 보려면.

다른 팁

CultureInfo.CurrentCulture.TextInfo.ToTitleCase("hello world");
String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test);

위의 코드는 작동하지 않습니다 .....

따라서 아래 코드를 lower로 변환하여 입력한 다음 함수를 적용하세요.

String test = "HELLO HOW ARE YOU";
string s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(test.ToLower());

그런 경우도 있는데 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

그만큼 정규식 예를 들어, 필요한 경우 조정할 수 있습니다. 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

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

ToTitleCase()가 도움이 될 것입니다.

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

가장 직접적인 옵션은 다음을 사용하는 것입니다. ToTitleCase .NET에서 사용할 수 있는 함수로 대부분의 경우 이름을 관리해야 합니다.처럼 가장자리 작동하지 않는 일부 이름이 있다고 지적했지만 이러한 이름은 매우 드물기 때문에 그러한 이름이 일반적인 문화를 대상으로 하지 않는 한 너무 걱정할 필요는 없습니다.

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

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

반환 ~ 내 이름

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

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

예를 들어 다음과 같은 문구가 있습니다."안녕하세요 세상.안녕하세요 여기는 스택오버플로우 세계입니다."는 "Hello World.안녕하세요, 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;
}

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

이 수업이 그 트릭을 수행합니다.새로운 접두사를 추가할 수 있습니다. _접두사 정적 문자열 배열.

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

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

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

강조 표시된 일부 문제/문제를 해결하려면 먼저 문자열을 소문자로 변환한 다음 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);
}

나는 이 방법을 좋아한다:

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

이것으로부터 들어올려진 MSDN 기사.

이것이 당신에게 도움이 되기를 바랍니다.

String fName = "firstname";
String lName = "lastname";
String capitalizedFName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(fName);
String capitalizedLName = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(lName);
 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;

        }

표시된 edg와 마찬가지로 특수 이름을 처리하려면 더 복잡한 알고리즘이 필요합니다(이것이 아마도 많은 곳에서 모든 것을 대문자로 강제하는 이유일 것입니다).

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

public string SentenceCase(string input)
{
    return input(0, 1).ToUpper + input.Substring(1).ToLower;
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top