programing

모든 첫 글자를 대문자로 변환하고 각 단어에 대해 소문자로 유지

subpage 2023. 4. 29. 09:20
반응형

모든 첫 글자를 대문자로 변환하고 각 단어에 대해 소문자로 유지

변환해야 하는 텍스트 문자열(대부분 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);
}

문자열 확장자로서의 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());
    }
}

언급URL : https://stackoverflow.com/questions/1943273/convert-all-first-letter-to-upper-case-rest-lower-for-each-word

반응형