[c#] 모든 첫 글자를 대문자로 변환하고 각 단어에 대해 더 낮게 유지

변환해야하는 텍스트 문자열 (대부분 약 5-6 단어)이 있습니다.

현재 텍스트는 다음과 같습니다.

THIS IS MY TEXT RIGHT NOW

다음으로 변환하고 싶습니다.

This Is My Text Right Now

문자열 컬렉션을 반복 할 수 있지만이 텍스트 수정을 수행하는 방법을 모르겠습니다.



답변

string s = "THIS IS MY TEXT RIGHT NOW";

s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());


답변

Thread.CurrentThread ( System.Threading ) 보다 CultureInfo ( System.Globalization ) 에서 ToTitleCase 를 호출하는 것을 선호합니다.

string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

하지만 jspcal 솔루션과 동일해야합니다.

편집하다

실제로 이러한 솔루션은 동일하지 않습니다 . CurrentThread–calls-> CultureInfo!


System.Threading.Thread.CurrentThread.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Threading.Thread.get_CurrentThread
IL_000B:  callvirt    System.Threading.Thread.get_CurrentCulture
IL_0010:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0015:  ldloc.0     // s
IL_0016:  callvirt    System.String.ToLower
IL_001B:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_0020:  stloc.0     // s

System.Globalization.CultureInfo.CurrentCulture

string s = "THIS IS MY TEXT RIGHT NOW";
s = System.Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());

IL_0000:  ldstr       "THIS IS MY TEXT RIGHT NOW"
IL_0005:  stloc.0     // s
IL_0006:  call        System.Globalization.CultureInfo.get_CurrentCulture
IL_000B:  callvirt    System.Globalization.CultureInfo.get_TextInfo
IL_0010:  ldloc.0     // s
IL_0011:  callvirt    System.String.ToLower
IL_0016:  callvirt    System.Globalization.TextInfo.ToTitleCase
IL_001B:  stloc.0     // s

참조 :


답변

문자열의 첫 번째 문자를 대문자로 변환하는 방법에는 두 가지가 있습니다.

첫 번째 방법은 첫 번째 문자를 간단히 캡핑하고 하위 문자열을 사용하여 나머지 문자열을 추가하는 메서드를 만드는 것입니다.

public string UppercaseFirst(string s)
    {
        return char.ToUpper(s[0]) + s.Substring(1);
    }

두 번째 방법 (약간 더 빠름)은 문자열을 char 배열로 분할 한 다음 문자열을 다시 빌드하는 것입니다.

public string UppercaseFirst(string s)
    {
        char[] a = s.ToCharArray();
        a[0] = char.ToUpper(a[0]);
        return new string(a);
    }


답변

테스트되지 않았지만 다음과 같이 작동합니다.

var phrase = "THIS IS MY TEXT RIGHT NOW";
var rx = new System.Text.RegularExpressions.Regex(@"(?<=\w)\w");
var newString = rx.Replace(phrase,new MatchEvaluator(m=>m.Value.ToLowerInvariant()));

본질적으로 “다른 영숫자 문자 다음에 나오는 모든 영숫자 문자에 대해 정규식 일치를 미리 만든 다음 자체의 소문자 버전으로 대체”라고 말합니다.


답변

웹 페이지에서 사용하는 경우 CSS를 사용할 수도 있습니다.

style="text-transform:capitalize;"


답변

큰 테이블을 만드는 속도가 문제가 될 때 Jamie Dixon의 두 번째 기능이 가장 좋지만 완전히 작동하지는 않습니다.

모든 문자를 소문자로 바꾸는 데 실패하고 문자열의 각 단어의 첫 글자가 아닌 문자열의 첫 글자 만 대문자로 표시합니다 … 아래 옵션은 두 문제를 모두 해결합니다.

    public string UppercaseFirstEach(string s)
    {
        char[] a = s.ToLower().ToCharArray();

        for (int i = 0; i < a.Count(); i++ )
        {
            a[i] = i == 0 || a[i-1] == ' ' ? char.ToUpper(a[i]) : a[i];

        }

        return new string(a);
    }

이 시점에서 이것이 여전히 가장 빠른 옵션인지 여부는 확실하지 않지만 RegexGeorge Mauer가 제공 하는 솔루션이 더 빠를 수 있습니다. 충분히 관심이있는 사람이 테스트해야합니다.


답변

아래 솔루션이 jspcal의 답변보다 다소 효율적인지 모르겠지만 Jamie와 George보다 객체 생성이 덜 필요하다고 확신합니다.

string s = "THIS IS MY TEXT RIGHT NOW";
StringBuilder sb = new StringBuilder(s.Length);
bool capitalize = true;
foreach (char c in s) {
    sb.Append(capitalize ? Char.ToUpper(c) : Char.ToLower(c));
    capitalize = !Char.IsLetter(c);
}
return sb.ToString();