Chuyển đổi chuỗi thành trường hợp tiêu đề


300

Tôi có một chuỗi chứa các từ trong hỗn hợp các ký tự chữ hoa và chữ thường.

Ví dụ: string myData = "a Simple string";

Tôi cần chuyển đổi ký tự đầu tiên của mỗi từ (cách nhau bằng khoảng trắng) thành chữ hoa. Vì vậy, tôi muốn kết quả là:string myData ="A Simple String";

Có cách nào dễ dàng để làm điều này? Tôi không muốn tách chuỗi và thực hiện chuyển đổi (đó sẽ là phương sách cuối cùng của tôi). Ngoài ra, nó được đảm bảo rằng các chuỗi bằng tiếng Anh.


1
http://support.microsoft.com/kb/312890 - Cách chuyển đổi chuỗi thành trường hợp thấp hơn, trên hoặc tiêu đề (phù hợp) bằng cách sử dụng Visual C #
ttarchala

Câu trả lời:


538

MSDN: TextInfo.ToTitleCase

Đảm bảo rằng bạn bao gồm: 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
Thật. Ngoài ra, nếu một từ là tất cả chữ hoa thì nó không hoạt động. ví dụ: "một đặc vụ FBI bắn DOG của tôi" -> "Một đặc vụ FBI bắn DOG của tôi". Và nó không xử lý "McDonalds", v.v.
Kobi

5
@Kirschstein chức năng này không hội tụ những từ này vào trường hợp tiêu đề, mặc dù chúng không nên bằng tiếng Anh. Xem tài liệu : Actual result: "War And Peace".
Kobi

5
@simbolo - Tôi đã Actuallt đề cập đến nó trong một bình luận ... Bạn có thể sử dụng một cái gì đó như text = Regex.Replace(text, @"(?<!\S)\p{Ll}", m => m.Value.ToUpper());, nhưng nó không hoàn hảo. Ví dụ: nó vẫn không xử lý dấu ngoặc kép hoặc dấu ngoặc đơn - "(one two three)"-> "(one Two Three)". Bạn có thể muốn hỏi một câu hỏi mới sau khi bạn tìm ra chính xác những gì bạn muốn làm với những trường hợp này.
Kobi

17
Vì một số lý do khi tôi có "DR", nó không trở thành "Dr" trừ khi tôi gọi .ToLower () trước khi gọi ToTitleCase () ... Vì vậy, đó là điều cần chú ý ...
Tod Thomson

16
Cần có .ToLower () cho chuỗi đầu vào nếu văn bản đầu vào ở dạng chữ hoa
Puneet Ghanshani

137

Thử cái này:

string myText = "a Simple string";

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

Như đã được chỉ ra, sử dụng TextInfo.ToTitleCase có thể không cung cấp cho bạn kết quả chính xác mà bạn muốn. Nếu bạn cần kiểm soát nhiều hơn đối với đầu ra, bạn có thể làm một cái gì đó như thế này:

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;
    }
}

Và sau đó sử dụng nó như vậy:

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

1
Tôi đã thử một vài biến thể của đối tượng TextInfo - không có lỗi nhưng chuỗi gốc (chữ hoa) không bao giờ được cập nhật. Đã cắm phương pháp này và rất đánh giá cao.
justSteve

6
@justSteve, từ MSDN ( msdn.microsoft.com/en-us/l Library / ra ): "Tuy nhiên, phương pháp này hiện không cung cấp vỏ bọc thích hợp để chuyển đổi một từ hoàn toàn viết hoa, chẳng hạn như từ viết tắt" - có lẽ bạn nên chỉ ToLower () nó đầu tiên (tôi biết điều này là cũ, nhưng chỉ trong tình cờ khác trường hợp ai đó vào nó và thắc mắc tại sao!)
nizmow

Chỉ khả dụng cho .NET Framework 4.7.2 <= khung hình của bạn hoạt động <= .NET Core 2.0
Paul Gorbas

70

Một biến thể khác. Dựa trên một số mẹo ở đây, tôi đã giảm nó thành phương pháp mở rộng này, hoạt động tuyệt vời cho mục đích của tôi:

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

8
CultureInfo.InvariantCARM.TextInfo.ToTitleCase (s.ToLower ()); sẽ thực sự phù hợp hơn!
Puneet Ghanshani

Chỉ khả dụng cho .NET Framework 4.7.2 <= công việc khung của bạn <= .NET Core 2.0
Paul Gorbas

Vì chúng tôi đang sử dụng InvariantCARM cho TitleCasing, nên sử dụng s.ToLowerInvariant () thay vì s.ToLower ().
Vinigas

27

Cá nhân tôi đã thử TextInfo.ToTitleCasephương pháp này, nhưng, tôi không hiểu tại sao nó không hoạt động khi tất cả các ký tự đều nằm trên.

Mặc dù tôi thích chức năng được cung cấp bởi Winston Smith , nhưng hãy để tôi cung cấp chức năng tôi hiện đang sử dụng:

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);
}

Chơi với một số chuỗi thử nghiệm :

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)));

Bố thí đầu ra :

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

1
@harsh: Giải pháp "xấu xí" tôi muốn nói ... không có nghĩa gì với tôi rằng trước tiên bạn phải chuyển đổi toàn bộ chuỗi thành chữ thường.
Luis Quijada

4
Đó là cố ý, bởi vì nếu bạn yêu cầu, hãy nói, "UNICEF và tổ chức từ thiện" được đặt tên tiêu đề, bạn không muốn nó được đổi thành Unicef.
Casey

4
Vì vậy, thay vì gọi ToLower()toàn bộ chuỗi, bạn muốn tự mình thực hiện tất cả các công việc đó và gọi cùng một chức năng trên từng ký tự? Không chỉ là một giải pháp xấu, nó còn mang lại lợi ích bằng không, và thậm chí sẽ mất nhiều thời gian hơn chức năng tích hợp.
krillgar

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

1
@ruffin Số Chuỗi con với một tham số int duy nhất bắt đầu tại chỉ mục đã cho và trả mọi thứ về cuối chuỗi.
krillgar

21

Gần đây tôi tìm thấy một giải pháp tốt hơn.

Nếu văn bản của bạn chứa mọi chữ cái viết hoa, thì TextInfo sẽ không chuyển đổi nó thành trường hợp thích hợp. Chúng ta có thể khắc phục điều đó bằng cách sử dụng chức năng chữ thường bên trong như thế này:

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

Bây giờ điều này sẽ chuyển đổi tất cả mọi thứ đi vào Rightcase.


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

1
Tôi thích rằng bạn đã thêm ToLower trước ToTitleCase, bao gồm tình huống trong đó văn bản đầu vào là tất cả các chữ hoa.
tham gia

7

Nếu ai đó quan tâm đến giải pháp cho Compact Framework:

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

Với phép nội suy chuỗi: return string.Join ("", text.Split ('') .Select (i => $ "{i.Sub chuỗi (0, 1) .ToUpper ()} {i.Sub chuỗi (1). ToLower ()} ") .ToArray ());
Ted

6

Đây là giải pháp cho vấn đề đó ...

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

5

Sử dụng ToLower()đầu tiên, hơn CultureInfo.CurrentCulture.TextInfo.ToTitleCasekết quả để có được đầu ra chính xác.

    //---------------------------------------------------------------
    // 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

Tôi cần một cách để đối phó với tất cả các từ mũ và tôi thích giải pháp của Ricky AH, nhưng tôi đã tiến thêm một bước để thực hiện nó như một phương pháp mở rộng. Điều này tránh bước phải tạo mảng ký tự của bạn sau đó gọi ToArray trên đó một cách rõ ràng mỗi lần - vì vậy bạn chỉ có thể gọi nó trên chuỗi, như vậy:

sử dụng:

string newString = oldString.ToProper();

mã:

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
Chỉ cần thêm một điều kiện HOẶC nếu (c == '' || c == '\' ') ... đôi khi các tên có chứa dấu nháy đơn (').
JSK

2

Nó tốt hơn để hiểu bằng cách thử mã của riêng bạn ...

Đọc thêm

http://www.stoolcodes.com/2014/04/convert-opes-to-uppercase-proper-case.html

1) Chuyển đổi một chuỗi thành chữ hoa

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

2) Chuyển đổi một chuỗi thành chữ thường

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

3) Chuyển đổi một chuỗi thành TitleCase

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

1

Đây là một thực hiện, từng nhân vật. Nên làm việc với "(Một Hai Ba)"

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

Bạn có thể trực tiếp thay đổi văn bản hoặc chuỗi thành đúng bằng phương pháp đơn giản này, sau khi kiểm tra các giá trị chuỗi rỗng hoặc rỗng để loại bỏ lỗi:

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

Thử cái này:

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;
            }
        }


Gọi phương thức này trong sự kiện TextChanged của TextBox.


0

Tôi đã sử dụng các tài liệu tham khảo ở trên và giải pháp hoàn chỉnh là: -

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

// Cần kết quả như "Infoa2z có nghĩa là tất cả thông tin"
// Chúng ta cũng cần chuyển đổi chuỗi bằng chữ thường, nếu không thì nó không hoạt động đúng.

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

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

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


0

Đây là những gì tôi sử dụng và nó hoạt động trong hầu hết các trường hợp trừ khi người dùng quyết định ghi đè lên nó bằng cách nhấn shift hoặc khóa mũ. Giống như trên bàn phím Android và 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

Đối với những người đang tìm cách tự động thực hiện trên phím nhấn, tôi đã thực hiện bằng mã sau trong vb.net trên một hộp điều khiển văn bản tùy chỉnh - rõ ràng bạn cũng có thể làm điều đó với một hộp văn bản thông thường - nhưng tôi thích khả năng thêm mã định kỳ cho các điều khiển cụ thể thông qua các điều khiển tùy chỉnh, nó phù hợp với khái niệm 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

Hoạt động tốt ngay cả với trường hợp lạc đà: 'someText trong 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

Là một phương pháp mở rộng:

/// <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;
}

Sử dụng:

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

Kết quả:

Kebab Is Deliciou's ;d C...


0

Thay thế bằng tham chiếu đến Microsoft.VisualBasic(xử lý các chuỗi chữ hoa quá):

string properCase = Strings.StrConv(str, VbStrConv.ProperCase);

0

Không sử dụng 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())));

Nó lặp qua từng chữ cái trong mỗi từ, chuyển đổi nó thành chữ hoa nếu đó là chữ cái đầu tiên chuyển đổi nó thành chữ thường.


-1

Tôi biết đây là một câu hỏi cũ nhưng tôi đã tìm kiếm điều tương tự cho C và tôi đã tìm ra nó vì vậy tôi đoán rằng tôi sẽ đăng nó nếu có ai đó đang tìm cách trong 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;
}
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.