변환해야하는 텍스트 문자열 (대부분 약 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);
}
이 시점에서 이것이 여전히 가장 빠른 옵션인지 여부는 확실하지 않지만 Regex
George 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();