답변:
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;"
ASP.NET
는 OP가 WEB에서하고 있음을 보여줍니다. 물론 이것은 OP가 해결책을 필요로하기 때문에 질문의 답이 C#
아니지만 문제를 해결하고 대안이 될 수 있습니다. +1
큰 테이블을 만드는 속도가 문제가 될 때 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();
관심이있을 수있는 가능한 솔루션 중 하나입니다. 하나의 루프에서 문자 배열을 오른쪽에서 왼쪽으로, 그 반대로 순회합니다.
public static string WordsToCapitalLetter(string value)
{
if (string.IsNullOrWhiteSpace(value))
{
throw new ArgumentException("value");
}
int inputValueCharLength = value.Length;
var valueAsCharArray = value.ToCharArray();
int min = 0;
int max = inputValueCharLength - 1;
while (max > min)
{
char left = value[min];
char previousLeft = (min == 0) ? left : value[min - 1];
char right = value[max];
char nextRight = (max == inputValueCharLength - 1) ? right : value[max - 1];
if (char.IsLetter(left) && !char.IsUpper(left) && char.IsWhiteSpace(previousLeft))
{
valueAsCharArray[min] = char.ToUpper(left);
}
if (char.IsLetter(right) && !char.IsUpper(right) && char.IsWhiteSpace(nextRight))
{
valueAsCharArray[max] = char.ToUpper(right);
}
min++;
max--;
}
return new string(valueAsCharArray);
}
문자열 확장으로 jspcal의 대답.
Program.cs
class Program
{
static void Main(string[] args)
{
var myText = "MYTEXT";
Console.WriteLine(myText.ToTitleCase()); //Mytext
}
}
StringExtensions.cs
using System;
public static class StringExtensions
{
public static string ToTitleCase(this string str)
{
if (str == null)
return null;
return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
}
}