문자열을 제목 대소 문자로 변환


300

대문자와 소문자를 혼합하여 단어를 포함하는 문자열이 있습니다.

예를 들면 다음과 같습니다. string myData = "a Simple string";

각 단어의 첫 문자 (공백으로 구분)를 대문자로 변환해야합니다. 그래서 결과를 다음과 같이 원합니다.string myData ="A Simple String";

이 작업을 수행하는 쉬운 방법이 있습니까? 나는 문자열을 나누고 변환을하고 싶지 않습니다 (마지막 수단이 될 것입니다). 또한 문자열이 영어로 보장됩니다.


1
http://support.microsoft.com/kb/312890-Visual C #을 사용하여 문자열을 소문자, 대문자 또는 제목 (적절한)으로 변환하는 방법
ttarchala

답변:


538

MSDN : TextInfo.ToTitleCase

다음을 포함해야합니다. using System.Globalization

string title = "war and peace";

TextInfo textInfo = new CultureInfo("en-US", false).TextInfo;

title = textInfo.ToTitleCase(title); 
Console.WriteLine(title) ; //War And Peace

//When text is ALL UPPERCASE...
title = "WAR AND PEACE" ;

title = textInfo.ToTitleCase(title); 
Console.WriteLine(title) ; //WAR AND PEACE

//You need to call ToLower to make it work
title = textInfo.ToTitleCase(title.ToLower()); 
Console.WriteLine(title) ; //War And Peace

37
진실. 또한 단어가 모두 대문자이면 작동하지 않습니다. 예 :- "FBI 요원이 내 DOG를 쐈습니다"-> "FBI 요원이 나의 DOG를 쐈습니다". 그리고 "McDonalds"등을 처리하지 않습니다.
Kobi

5
@Kirschstein이 함수 영어로되어서 안되지만이 단어를 제목으로 변환합니다. 설명서를 참조하십시오 Actual result: "War And Peace".
Kobi

5
@simbolo-댓글에 실제로 언급했습니다 ... 같은 것을 사용할 수는 text = Regex.Replace(text, @"(?<!\S)\p{Ll}", m => m.Value.ToUpper());있지만 완벽하지는 않습니다. 예를 들어, 여전히 따옴표 나 괄호 "(one two three)"-->를 처리하지 않습니다 "(one Two Three)". 이 경우들과 정확히 무엇을하고 싶은지 파악한 후에 새로운 질문을 할 수 있습니다.
Kobi

17
어떤 이유로 "DR"이있는 경우 ToTitleCase ()를 호출하기 전에 먼저 .ToLower ()를 호출하지 않으면 "Dr"이되지 않습니다. 따라서주의해야 할 사항입니다.
Tod Thomson

16
입력 텍스트가 대문자 인 경우 입력 문자열에 대한 .ToLower는 ()가 필요합니다
Puneet Ghanshani

137

이 시도:

string myText = "a Simple string";

string asTitleCase =
    System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.
    ToTitleCase(myText.ToLower());

이미 지적했듯이 TextInfo.ToTitleCase를 사용하면 원하는 정확한 결과를 얻지 못할 수 있습니다. 출력에 대한 제어가 더 필요한 경우 다음과 같이 할 수 있습니다.

IEnumerable<char> CharsToTitleCase(string s)
{
    bool newWord = true;
    foreach(char c in s)
    {
        if(newWord) { yield return Char.ToUpper(c); newWord = false; }
        else yield return Char.ToLower(c);
        if(c==' ') newWord = true;
    }
}

그런 다음 다음과 같이 사용하십시오.

var asTitleCase = new string( CharsToTitleCase(myText).ToArray() );

1
TextInfo 객체의 여러 변형을 시도했지만 오류는 없지만 원래 문자열 (대문자)은 업데이트되지 않았습니다. 이 방법을 사용했으며 매우 감사합니다.
justSteve

6
MSDN의 @justSteve ( msdn.microsoft.com/en-us/library/… ) : "그러나이 방법은 현재 약어와 같이 완전히 대문자 인 단어를 변환하기위한 적절한 대소 문자를 제공하지 않습니다." 그냥 ToLower () 그것 먼저 (이것은 오래된 것을 알고 있지만 다른 누군가가 그것을
넘어서

= 당신의 프레임 워크 <= .NET 코어 2.0 .NET 프레임 워크 4.7.2 <에만 사용할 수 있습니다
폴 Gorbas

70

또 다른 변형. 여기 몇 가지 팁을 바탕 으로이 확장 방법으로 축소하여 내 목적에 효과적입니다.

public static string ToTitleCase(this string s) =>
    CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower());

8
CultureInfo.InvariantCulture.TextInfo.ToTitleCase (s.ToLower ()); 실제로 더 잘 맞을 것입니다!
Puneet Ghanshani

= 당신의 프레임 워크 <= .NET 코어 2.0 .NET 프레임 워크 4.7.2 <에만 사용할 수 있습니다
폴 Gorbas

TitleCasing에 InvariantCulture를 사용하므로 s.ToLower () 대신 s.ToLowerInvariant ()를 사용해야합니다.
Vinigas

27

개인적으로 나는 TextInfo.ToTitleCase 방법을 모든 문자가 대문자 일 때 왜 작동하지 않는지 이해하지 못합니다.

Winston Smith가 제공하는 util 기능을 좋아하지만 현재 사용중인 기능을 제공하겠습니다.

public static String TitleCaseString(String s)
{
    if (s == null) return s;

    String[] words = s.Split(' ');
    for (int i = 0; i < words.Length; i++)
    {
        if (words[i].Length == 0) continue;

        Char firstChar = Char.ToUpper(words[i][0]); 
        String rest = "";
        if (words[i].Length > 1)
        {
            rest = words[i].Substring(1).ToLower();
        }
        words[i] = firstChar + rest;
    }
    return String.Join(" ", words);
}

테스트 문자열을 가지고 노는 것 :

String ts1 = "Converting string to title case in C#";
String ts2 = "C";
String ts3 = "";
String ts4 = "   ";
String ts5 = null;

Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts1)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts2)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts3)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts4)));
Console.Out.WriteLine(String.Format("|{0}|", TitleCaseString(ts5)));

주기 출력 :

|Converting String To Title Case In C#|
|C|
||
|   |
||

1
@harsh : "추악한"솔루션 ... 전체 문자열을 소문자로 변환해야한다는 것은 말이되지 않습니다.
Luis Quijada

4
"UNICEF와 자선 단체"를 제목으로 요청하면, Unicef로 변경하기를 원하지 않기 때문에 의도적 인 것입니다.
Casey

4
따라서 ToLower()전체 문자열 을 호출 하는 대신 모든 작업을 직접 수행하고 각 개별 문자에서 동일한 기능을 호출하고 싶습니까? 이 솔루션은 추악한 솔루션 일뿐 아니라 혜택이 전혀 없으며 내장 기능보다 시간이 더 오래 걸립니다.
krillgar

3
rest = words[i].Substring(1).ToLower();
krillgar

1
@ruffin No. 단일 int 매개 변수가있는 하위 문자열 은 지정된 색인에서 시작하여 문자열의 끝까지 모든 것을 반환합니다.
krillgar

21

최근에 더 나은 해결책을 찾았습니다.

텍스트에 모든 문자가 대문자로 포함되어 있으면 TextInfo 가 올바른 문자로 변환하지 않습니다. 다음과 같이 소문자 함수를 사용하여 문제를 해결할 수 있습니다.

public static string ConvertTo_ProperCase(string text)
{
    TextInfo myTI = new CultureInfo("en-US", false).TextInfo;
    return myTI.ToTitleCase(text.ToLower());
}

이제 이것은 모든 것을 Propercase로 변환합니다.


17
public static string PropCase(string strText)
{
    return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
}

1
ToTitleCase 이전에 ToLower를 추가 했으므로 입력 텍스트가 모두 대문자 인 상황을 다룹니다.
joelc

7

누군가 Compact Framework 솔루션에 관심이있는 경우 :

return String.Join(" ", thestring.Split(' ').Select(i => i.Substring(0, 1).ToUpper() + i.Substring(1).ToLower()).ToArray());

문자열 보간 : return string.Join ( "", text.Split ( '') .Select (i => $ "{i.Substring (0, 1) .ToUpper ()} {i.Substring (1). ToLower ()} ") .ToArray ());
테드

6

그 문제에 대한 해결책은 다음과 같습니다.

CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
TextInfo textInfo = cultureInfo.TextInfo;
string txt = textInfo.ToTitleCase(txt);

5

올바른 결과를 얻으려면 결과 ToLower()보다 먼저 사용하십시오 CultureInfo.CurrentCulture.TextInfo.ToTitleCase.

    //---------------------------------------------------------------
    // Get title case of a string (every word with leading upper case,
    //                             the rest is lower case)
    //    i.e: ABCD EFG -> Abcd Efg,
    //         john doe -> John Doe,
    //         miXEd CaSING - > Mixed Casing
    //---------------------------------------------------------------
    public static string ToTitleCase(string str)
    {
        return CultureInfo.CurrentCulture.TextInfo.ToTitleCase(str.ToLower());
    }

3

모든 대문자 단어를 처리하는 방법이 필요했고 Ricky AH의 솔루션이 마음에 들었지만 확장 방법으로 구현하기 위해 한 단계 더 나아갔습니다. 이렇게하면 문자 배열을 생성하고 매번 명시 적으로 ToArray를 호출 해야하는 단계를 피할 수 있습니다. 따라서 문자열에서 다음과 같이 호출 할 수 있습니다.

용법:

string newString = oldString.ToProper();

암호:

public static class StringExtensions
{
    public static string ToProper(this string s)
    {
        return new string(s.CharsToTitleCase().ToArray());
    }

    public static IEnumerable<char> CharsToTitleCase(this string s)
    {
        bool newWord = true;
        foreach (char c in s)
        {
            if (newWord) { yield return Char.ToUpper(c); newWord = false; }
            else yield return Char.ToLower(c);
            if (c == ' ') newWord = true;
        }
    }

}

1
(c == ''|| c == '\' ') ... 때때로 이름에 아포스트로피 (')가 있으면 OR 조건을 하나 더 추가했습니다.
JSK

2

자신의 코드를 시도하여 이해하는 것이 좋습니다 ...

더 읽어보기

http://www.stupidcodes.com/2014/04/convert-string-to-uppercase-proper-case.html

1) 문자열을 대문자로 변환

string lower = "converted from lowercase";
Console.WriteLine(lower.ToUpper());

2) 문자열을 소문자로 변환

string upper = "CONVERTED FROM UPPERCASE";
Console.WriteLine(upper.ToLower());

3) 문자열을 TitleCase로 변환

    CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
    TextInfo textInfo = cultureInfo.TextInfo;
    string txt = textInfo.ToTitleCase(TextBox1.Text());

1

다음은 문자 별 구현입니다. "(One Two Three)"와 함께 작동해야합니다.

public static string ToInitcap(this string str)
{
    if (string.IsNullOrEmpty(str))
        return str;
    char[] charArray = new char[str.Length];
    bool newWord = true;
    for (int i = 0; i < str.Length; ++i)
    {
        Char currentChar = str[i];
        if (Char.IsLetter(currentChar))
        {
            if (newWord)
            {
                newWord = false;
                currentChar = Char.ToUpper(currentChar);
            }
            else
            {
                currentChar = Char.ToLower(currentChar);
            }
        }
        else if (Char.IsWhiteSpace(currentChar))
        {
            newWord = true;
        }
        charArray[i] = currentChar;
    }
    return new string(charArray);
}

1
String TitleCaseString(String s)
{
    if (s == null || s.Length == 0) return s;

    string[] splits = s.Split(' ');

    for (int i = 0; i < splits.Length; i++)
    {
        switch (splits[i].Length)
        {
            case 1:
                break;

            default:
                splits[i] = Char.ToUpper(splits[i][0]) + splits[i].Substring(1);
                break;
        }
    }

    return String.Join(" ", splits);
}

1

오류를 제거하기 위해 null 또는 빈 문자열 값을 확인한 후이 간단한 방법을 사용하여 텍스트 또는 문자열을 올바른 것으로 직접 변경할 수 있습니다.

public string textToProper(string text)
{
    string ProperText = string.Empty;
    if (!string.IsNullOrEmpty(text))
    {
        ProperText = CultureInfo.CurrentCulture.TextInfo.ToTitleCase(text);
    }
    else
    {
        ProperText = string.Empty;
    }
    return ProperText;
}

0

이 시도:

using System.Globalization;
using System.Threading;
public void ToTitleCase(TextBox TextBoxName)
        {
            int TextLength = TextBoxName.Text.Length;
            if (TextLength == 1)
            {
                CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
                TextInfo textInfo = cultureInfo.TextInfo;
                TextBoxName.Text = textInfo.ToTitleCase(TextBoxName.Text);
                TextBoxName.SelectionStart = 1;
            }
            else if (TextLength > 1 && TextBoxName.SelectionStart < TextLength)
            {
                int x = TextBoxName.SelectionStart;
                CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
                TextInfo textInfo = cultureInfo.TextInfo;
                TextBoxName.Text = textInfo.ToTitleCase(TextBoxName.Text);
                TextBoxName.SelectionStart = x;
            }
            else if (TextLength > 1 && TextBoxName.SelectionStart >= TextLength)
            {
                CultureInfo cultureInfo = Thread.CurrentThread.CurrentCulture;
                TextInfo textInfo = cultureInfo.TextInfo;
                TextBoxName.Text = textInfo.ToTitleCase(TextBoxName.Text);
                TextBoxName.SelectionStart = TextLength;
            }
        }


TextBox의 TextChanged 이벤트에서이 메서드를 호출하십시오.


0

위의 참조를 사용했으며 완벽한 해결책은 다음과 같습니다.

Use Namespace System.Globalization;
string str="INFOA2Z means all information";

// "Infoa2z는 모든 정보를 의미합니다"와 같은 결과
가 필요합니다. // 문자열도 소문자로 변환해야합니다. 그렇지 않으면 제대로 작동하지 않습니다.

TextInfo ProperCase= new CultureInfo("en-US", false).TextInfo;

str= ProperCase.ToTitleCase(str.toLower());

http://www.infoa2z.com/asp.net/change-string-to-proper-case-in-an-asp.net-using-c#


0

이것은 내가 사용하는 것이며 사용자가 Shift 또는 Caps Lock을 눌러 재정의하기로 결정하지 않는 한 대부분의 경우 작동합니다. Android 및 iOS 키보드와 유사합니다.

Private Class ProperCaseHandler
    Private Const wordbreak As String = " ,.1234567890;/\-()#$%^&*€!~+=@"
    Private txtProperCase As TextBox

    Sub New(txt As TextBox)
        txtProperCase = txt
        AddHandler txt.KeyPress, AddressOf txtTextKeyDownProperCase
    End Sub

    Private Sub txtTextKeyDownProperCase(ByVal sender As System.Object, ByVal e As Windows.Forms.KeyPressEventArgs)
        Try
            If Control.IsKeyLocked(Keys.CapsLock) Or Control.ModifierKeys = Keys.Shift Then
                Exit Sub
            Else
                If txtProperCase.TextLength = 0 Then
                    e.KeyChar = e.KeyChar.ToString.ToUpper()
                    e.Handled = False
                Else
                    Dim lastChar As String = txtProperCase.Text.Substring(txtProperCase.SelectionStart - 1, 1)

                    If wordbreak.Contains(lastChar) = True Then
                        e.KeyChar = e.KeyChar.ToString.ToUpper()
                        e.Handled = False
                    End If
                End If

            End If

        Catch ex As Exception
            Exit Sub
        End Try
    End Sub
End Class

0

keypress에서 자동으로 수행하려는 사용자의 경우 사용자 정의 textboxcontrol의 vb.net에서 다음 코드로 수행했습니다. 일반 텍스트 상자로도 가능합니다.하지만 특정 컨트롤에 반복 코드를 추가 할 수있는 가능성이 좋습니다. 사용자 지정 컨트롤을 통해 OOP의 개념에 적합합니다.

Imports System.Windows.Forms
Imports System.Drawing
Imports System.ComponentModel

Public Class MyTextBox
    Inherits System.Windows.Forms.TextBox
    Private LastKeyIsNotAlpha As Boolean = True
    Protected Overrides Sub OnKeyPress(e As KeyPressEventArgs)
        If _ProperCasing Then
            Dim c As Char = e.KeyChar
            If Char.IsLetter(c) Then
                If LastKeyIsNotAlpha Then
                    e.KeyChar = Char.ToUpper(c)
                    LastKeyIsNotAlpha = False
                End If
            Else
                LastKeyIsNotAlpha = True
            End If
        End If
        MyBase.OnKeyPress(e)
End Sub
    Private _ProperCasing As Boolean = False
    <Category("Behavior"), Description("When Enabled ensures for automatic proper casing of string"), Browsable(True)>
    Public Property ProperCasing As Boolean
        Get
            Return _ProperCasing
        End Get
        Set(value As Boolean)
            _ProperCasing = value
        End Set
    End Property
End Class

0

낙타의 경우에도 잘 작동합니다 : 'someText in YourPage'

public static class StringExtensions
{
    /// <summary>
    /// Title case example: 'Some Text In Your Page'.
    /// </summary>
    /// <param name="text">Support camel and title cases combinations: 'someText in YourPage'</param>
    public static string ToTitleCase(this string text)
    {
        if (string.IsNullOrEmpty(text))
        {
            return text;
        }
        var result = string.Empty;
        var splitedBySpace = text.Split(new[]{ ' ' }, StringSplitOptions.RemoveEmptyEntries);
        foreach (var sequence in splitedBySpace)
        {
            // let's check the letters. Sequence can contain even 2 words in camel case
            for (var i = 0; i < sequence.Length; i++)
            {
                var letter = sequence[i].ToString();
                // if the letter is Big or it was spaced so this is a start of another word
                if (letter == letter.ToUpper() || i == 0)
                {
                    // add a space between words
                    result += ' ';
                }
                result += i == 0 ? letter.ToUpper() : letter;
            }
        }            
        return result.Trim();
    }
}

0

확장 방법으로 :

/// <summary>
//     Returns a copy of this string converted to `Title Case`.
/// </summary>
/// <param name="value">The string to convert.</param>
/// <returns>The `Title Case` equivalent of the current string.</returns>
public static string ToTitleCase(this string value)
{
    string result = string.Empty;

    for (int i = 0; i < value.Length; i++)
    {
        char p = i == 0 ? char.MinValue : value[i - 1];
        char c = value[i];

        result += char.IsLetter(c) && ((p is ' ') || p is char.MinValue) ? $"{char.ToUpper(c)}" : $"{char.ToLower(c)}";
    }

    return result;
}

용법:

"kebab is DELICIOU's   ;d  c...".ToTitleCase();

결과:

Kebab Is Deliciou's ;d C...



0

사용하지 않고 TextInfo:

public static string TitleCase(this string text, char seperator = ' ') =>
  string.Join(seperator, text.Split(seperator).Select(word => new string(
    word.Select((letter, i) => i == 0 ? char.ToUpper(letter) : char.ToLower(letter)).ToArray())));

각 단어의 모든 문자를 반복하여 첫 번째 문자 인 경우 대문자로 변환하고 그렇지 않으면 소문자로 변환합니다.


-1

나는 이것이 오래된 질문이라는 것을 알고 있지만 C에 대해 똑같은 것을 찾고 있었고 그것을 알아 냈으므로 다른 누군가가 C에서 길을 찾고 있다면 그것을 게시 할 것이라고 생각했다.

char proper(char string[]){  

int i = 0;

for(i=0; i<=25; i++)
{
    string[i] = tolower(string[i]);  //converts all character to lower case
    if(string[i-1] == ' ') //if character before is a space 
    {
        string[i] = toupper(string[i]); //converts characters after spaces to upper case
    }

}
    string[0] = toupper(string[0]); //converts first character to upper case


    return 0;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.