문자열을 제목 대소 문자로 변환 대문자로 변환해야합니다.

대문자와 소문자를 혼합하여 단어를 포함하는 문자열이 있습니다.

예를 들면 다음과 같습니다. string myData = "a Simple string";

각 단어의 첫 문자 (공백으로 구분)를 대문자로 변환해야합니다. 그래서 결과를 다음과 같이 원합니다.string myData ="A Simple String";

이 작업을 수행하는 쉬운 방법이 있습니까? 나는 문자열을 나누고 변환을하고 싶지 않습니다 (마지막 수단이 될 것입니다). 또한 문자열이 영어로 보장됩니다.



답변

MSDN : TextInfo.ToTitleCase

다음을 포함해야합니다. using System.Globalization

string title = "war and peace";

TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;

title = textInfo.ToTitleCase(title);
Console.WriteLine(title) ; //War And Peace

//When text is ALL UPPERCASE...
title = "WAR AND PEACE" ;

title = textInfo.ToTitleCase(title);
Console.WriteLine(title) ; //WAR AND PEACE

//You need to call ToLower to make it work
title = textInfo.ToTitleCase(title.ToLower());
Console.WriteLine(title) ; //War And Peace


답변

이 시도:

string myText = "a Simple string";

string asTitleCase =
    System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.
    ToTitleCase(myText.ToLower());

이미 지적했듯이 TextInfo.ToTitleCase를 사용하면 원하는 정확한 결과를 얻지 못할 수 있습니다. 출력에 대한 제어가 더 필요한 경우 다음과 같이 할 수 있습니다.

IEnumerable<char> CharsToTitleCase(string s)
{
    bool newWord = true;
    foreach(char c in s)
    {
        if(newWord) { yield return Char.ToUpper(c); newWord = false; }
        else yield return Char.ToLower(c);
        if(c==' ') newWord = true;
    }
}

그런 다음 다음과 같이 사용하십시오.

var asTitleCase = new string( CharsToTitleCase(myText).ToArray() );


답변

또 다른 변형. 여기 몇 가지 팁을 바탕 으로이 확장 방법으로 축소하여 내 목적에 효과적입니다.

public static string ToTitleCase(this string s) =>
    CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower());


답변

개인적으로 나는 TextInfo.ToTitleCase 방법을 모든 문자가 대문자 일 때 왜 작동하지 않는지 이해하지 못합니다.

Winston Smith가 제공하는 util 기능을 좋아하지만 현재 사용중인 기능을 제공하겠습니다.

public static String TitleCaseString(String s)
{
    if (s == null) return s;

    String[] words = s.Split(' ');
    for (int i = 0; i < words.Length; i++)
    {
        if (words[i].Length == 0) continue;

        Char firstChar = Char.ToUpper(words[i][0]);
        String rest = "";
        if (words[i].Length > 1)
        {
            rest = words[i].Substring(1).ToLower();
        }
        words[i] = firstChar + rest;
    }
    return String.Join(" ", words);
}

테스트 문자열을 가지고 노는 것 :

String ts1 = "Converting string to title case in C#";
String ts2 = "C";
String ts3 = "";
String ts4 = "   ";
String ts5 = null;

Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts1)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts2)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts3)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts4)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts5)));

주기 출력 :

|Converting String To Title Case In C#|
|C|
||
|   |
||


답변

최근에 더 나은 해결책을 찾았습니다.

텍스트에 모든 문자가 대문자로 포함되어 있으면 TextInfo 가 올바른 문자로 변환하지 않습니다. 다음과 같이 소문자 함수를 사용하여 문제를 해결할 수 있습니다.

public static string ConvertTo_ProperCase(string text)
{
    TextInfo myTI = new CultureInfo("en-US", false).TextInfo;
    return myTI.ToTitleCase(text.ToLower());
}

이제 이것은 모든 것을 Propercase로 변환합니다.


답변

public static string PropCase(string strText)
{
    return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
}


답변

누군가 Compact Framework 솔루션에 관심이있는 경우 :

return String.Join(" ", thestring.Split(' ').Select(i => i.Substring(0, 1).ToUpper() + i.Substring(1).ToLower()).ToArray());