모든 첫 글자를 대문자로 변환하고 각 단어에 대해 소문자로 유지
변환해야 하는 텍스트 문자열(대부분 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());
CultureInfo(System)에서 ToTitleCase를 호출하는 것을 선호합니다.세계화)가 스레드보다 큽니다.현재 스레드(시스템).스레드화):
string s = "THIS IS MY TEXT RIGHT NOW";
s = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(s.ToLower());
하지만 jspcal의 솔루션과 동일해야 합니다.
편집
실제로 이러한 솔루션은 같지 않습니다.CurrentThread
--http-->CultureInfo
!
시스템. 스레딩.스레드.현재스레드.현재 문화
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
시스템. 세계화.CultureInfo.현재의 문화
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);
}
두 번째 방법은 문자열을 문자 배열로 분할한 다음 문자열을 다시 만드는 것입니다.
public string UppercaseFirst(string s)
{
char[] a = s.ToCharArray();
a[0] = char.ToUpper(a[0]);
return new string(a);
}
웹 페이지에서 사용하는 경우 CSS도 사용할 수 있습니다.
style="text-transform:capitalize;"
테스트되지 않았지만 다음과 같은 방법으로 작동해야 합니다.
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()));
기본적으로 "다른 영숫자 문자 뒤에 오는 모든 영숫자 문자에 대해 정규식 일치를 수행한 다음 소문자 버전으로 바꿉니다"라고 말합니다.
큰 테이블을 만들 때는 속도가 중요하기 때문에 제이미 딕슨의 두 번째 기능이 가장 좋지만 완전히 작동하지는 않습니다.
모든 문자를 소문자로 변환하지 않고 문자열의 첫 글자만 대문자로 변환합니다. 문자열의 각 단어의 첫 글자는 대문자로 변환하지 않습니다.다음 옵션은 두 가지 문제를 모두 해결합니다.
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
조지 마우어가 제공한 해결책이 더 빠를 수도 있습니다...충분히 신경쓰는 사람은 테스트를 해봐야 합니다.
아래 솔루션이 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();
이 기술을 사용해 보십시오. 원하는 결과를 반환합니다.
CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
그리고 사용하는 것을 잊지 마세요.
첫 번째 답변 외에도 문자열 선택 시작 색인을 단어 끝으로 변경해야 합니다. 그렇지 않으면 문자열에 있는 문자의 역순이 표시됩니다.
s.SelectionStart = s.Length;
이것은 당신이 관심을 가질 수 있는 가능한 해결책 중 하나입니다.하나의 루프에서 오른쪽에서 왼쪽으로 또는 그 반대로 문자 배열을 이동합니다.
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);
}
파일 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());
}
}
언급URL : https://stackoverflow.com/questions/1943273/convert-all-first-letter-to-upper-case-rest-lower-for-each-word
'programing' 카테고리의 다른 글
VBA(Excel)에서 DateDiff-Value(밀리초)를 가져오는 방법은 무엇입니까? (0) | 2023.04.29 |
---|---|
코드백 내에서 제어 템플릿의 요소에 액세스하는 방법 (0) | 2023.04.29 |
그리드 행 및 열 위치를 프로그래밍 방식으로 설정하는 방법 (0) | 2023.04.29 |
Eclipse 전복 플러그인을 사용하여 커밋하려고 할 때 "CHECKOUT는 버전 리소스에서만 수행할 수 있습니다"가 표시됨 (0) | 2023.04.29 |
Visual Studio에서 단일 스레드를 디버그하는 방법은 무엇입니까? (0) | 2023.04.29 |