Mengonversi string menjadi judul huruf

300

Saya memiliki string yang berisi kata-kata dalam campuran karakter huruf besar dan kecil.

Sebagai contoh: string myData = "a Simple string";

Saya perlu mengubah karakter pertama dari setiap kata (dipisahkan oleh spasi) menjadi huruf besar. Jadi saya ingin hasilnya sebagai:string myData ="A Simple String";

Apakah ada cara mudah untuk melakukan ini? Saya tidak ingin membagi string dan melakukan konversi (itu akan menjadi pilihan terakhir saya). Juga, dijamin bahwa senarnya dalam bahasa Inggris.

Naveen
sumber
1
http://support.microsoft.com/kb/312890 - Bagaimana mengkonversi string untuk menurunkan, atas, atau judul kasus (yang tepat) dengan menggunakan Visual C #
ttarchala

Jawaban:

538

MSDN: TextInfo.ToTitleCase

Pastikan Anda memasukkan: 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
Kobi
sumber
37
Benar. Juga, jika sebuah kata huruf besar semua itu tidak berfungsi. misalnya - "agen FBI menembak DOG saya" -> "Seorang agen FBI menembak DOG saya". Dan itu tidak menangani "McDonalds", dan sebagainya.
Kobi
5
@Kirschstein fungsi ini tidak konversi dari kata-kata ini dengan kasus judul, meskipun mereka tidak harus dalam bahasa Inggris. Lihat dokumentasi: Actual result: "War And Peace".
Kobi
5
@simbolo - Saya benar-benar menyebutkannya dalam komentar ... Anda dapat menggunakan sesuatu seperti text = Regex.Replace(text, @"(?<!\S)\p{Ll}", m => m.Value.ToUpper());, tetapi jauh dari sempurna. Misalnya, masih tidak menangani tanda kutip atau tanda kurung - "(one two three)"-> "(one Two Three)". Anda mungkin ingin mengajukan pertanyaan baru setelah Anda tahu persis apa yang ingin Anda lakukan dengan kasus-kasus ini.
Kobi
17
Untuk beberapa alasan ketika saya memiliki "DR" itu tidak menjadi "Dr" kecuali saya memanggil. TooLower () terlebih dahulu sebelum memanggil ToTitleCase () ... Jadi itu sesuatu yang harus diperhatikan ...
Tod Thomson
16
.ToLower () untuk memasukkan string diperlukan jika teks input dalam huruf besar
Puneet Ghanshani
137

Coba ini:

string myText = "a Simple string";

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

Seperti yang telah ditunjukkan, menggunakan TextInfo.ToTitleCase mungkin tidak memberikan hasil yang Anda inginkan. Jika Anda perlu lebih banyak kontrol atas output, Anda dapat melakukan sesuatu seperti ini:

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

Dan kemudian gunakan seperti ini:

var asTitleCase = new string( CharsToTitleCase(myText).ToArray() );
Winston Smith
sumber
1
Saya mencoba beberapa variasi objek TextInfo - tidak ada kesalahan tetapi string asli (huruf besar) tidak pernah diperbarui. Mencolokkan metode ini dan sangat menghargai.
justSteve
6
@justSteve, dari MSDN ( msdn.microsoft.com/en-us/library/… ): "Namun, metode ini saat ini tidak menyediakan casing yang tepat untuk mengonversi kata yang seluruhnya huruf besar, seperti akronim" - Anda mungkin harus hanya ToLower () yang pertama (saya tahu ini sudah tua, tapi kalau-kalau ada orang lain yang menemukannya dan bertanya-tanya mengapa!)
nizmow
Hanya tersedia untuk .NET Framework 4.7.2 <= kerja bingkai Anda <= .NET Core 2.0
Paul Gorbas
70

Namun variasi lain. Berdasarkan beberapa tips di sini, saya telah menguranginya menjadi metode ekstensi ini, yang bekerja sangat baik untuk tujuan saya:

public static string ToTitleCase(this string s) =>
    CultureInfo.InvariantCulture.TextInfo.ToTitleCase(s.ToLower());
Todd Menier
sumber
8
CultureInfo.InvariantCulture.TextInfo.ToTitleCase (s.ToLower ()); akan lebih cocok sebenarnya!
Puneet Ghanshani
Hanya tersedia untuk .NET Framework 4.7.2 <= kerja bingkai Anda <= .NET Core 2.0
Paul Gorbas
Karena kita menggunakan InvariantCulture untuk TitleCasing, s.ToLowerInvariant () harus digunakan sebagai ganti s.ToLower ().
Vinigas
27

Secara pribadi saya mencoba TextInfo.ToTitleCasemetode ini, tetapi, saya tidak mengerti mengapa itu tidak berhasil ketika semua karakter ditulis dengan huruf besar.

Meskipun saya menyukai fungsi util yang disediakan oleh Winston Smith , izinkan saya menyediakan fungsi yang saya gunakan saat ini:

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

Bermain dengan beberapa senar tes :

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

Memberikan hasil :

|Converting String To Title Case In C#|
|C|
||
|   |
||
Luis Quijada
sumber
1
@harsh: "jelek" solusi saya akan mengatakan ... tidak masuk akal bagi saya bahwa Anda harus terlebih dahulu mengubah seluruh string menjadi huruf kecil.
Luis Quijada
4
Ini disengaja, karena jika Anda meminta, katakanlah, "UNICEF dan amal" untuk dijadikan judul, Anda tidak ingin itu diubah menjadi Unicef.
Casey
4
Jadi, alih-alih memanggil ToLower()seluruh string, Anda lebih suka melakukan semua itu sendiri dan memanggil fungsi yang sama pada setiap karakter individu? Tidak hanya itu solusi yang jelek, itu memberikan manfaat nol, dan bahkan akan memakan waktu lebih lama dari fungsi bawaan.
krillgar
3
rest = words[i].Substring(1).ToLower();
krillgar
1
@ruffin No. Substring dengan parameter int tunggal dimulai pada indeks yang diberikan, dan mengembalikan semuanya ke akhir string.
krillgar
21

Baru-baru ini saya menemukan solusi yang lebih baik.

Jika teks Anda berisi setiap huruf dalam huruf besar, maka TextInfo tidak akan mengonversinya menjadi huruf besar. Kita dapat memperbaikinya dengan menggunakan fungsi huruf kecil di dalam seperti ini:

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

Sekarang ini akan mengonversi semua yang masuk ke dalam Propercase.

Binod
sumber
17
public static string PropCase(string strText)
{
    return new CultureInfo("en").TextInfo.ToTitleCase(strText.ToLower());
}
Rajesh
sumber
1
Saya suka Anda menambahkan ToLower sebelum ToTitleCase, mencakup situasi di mana teks input adalah huruf besar semua.
joelc
7

Jika seseorang tertarik dengan solusi untuk Compact Framework:

return String.Join(" ", thestring.Split(' ').Select(i => i.Substring(0, 1).ToUpper() + i.Substring(1).ToLower()).ToArray());
Mibou
sumber
Dengan interpolasi string: return string.Join ("", text.Split (''). Pilih (i => $ "{i.Substring (0, 1) .ToUpper ()} {i.Substring (1). ToLower ()} ") .ToArray ());
Ted
6

Inilah solusi untuk masalah itu ...

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

Gunakan ToLower()dulu, daripada CultureInfo.CurrentCulture.TextInfo.ToTitleCasepada hasil untuk mendapatkan output yang benar.

    //---------------------------------------------------------------
    // 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());
    }
DDan
sumber
3

Saya membutuhkan cara untuk menangani semua kata-kata penutup, dan saya menyukai solusi Ricky AH, tetapi saya mengambil langkah lebih jauh untuk mengimplementasikannya sebagai metode ekstensi. Ini menghindari langkah harus membuat array karakter Anda kemudian memanggil ToArray di atasnya secara eksplisit setiap waktu - jadi Anda bisa menyebutnya pada string, seperti:

pemakaian:

string newString = oldString.ToProper();

kode:

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

}
Adam Diament
sumber
1
Hanya menambahkan satu lagi kondisi ATAU jika (c == '' || c == '\' ') ... kadang-kadang nama memang mengandung tanda kutip (').
JSK
2

Lebih baik dipahami dengan mencoba kode Anda sendiri ...

Baca lebih lajut

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

1) Ubah String menjadi Huruf Besar

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

2) Ubah String menjadi Huruf Kecil

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

3) Konversi String ke TitleCase

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

Berikut ini adalah implementasi, karakter demi karakter. Harus bekerja dengan "(Satu Dua Tiga)"

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);
}
Jeson Martajaya
sumber
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);
}
varun sharma
sumber
1

Anda dapat langsung mengubah teks atau string menjadi layak menggunakan metode sederhana ini, setelah memeriksa nilai string nol atau kosong untuk menghilangkan kesalahan:

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;
}
Ashraf Abusada
sumber
0

Coba ini:

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


Panggil metode ini dalam acara TextChanged dari TextBox.

krishna
sumber
0

Saya menggunakan referensi di atas dan solusi lengkapnya adalah: -

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

// Butuh hasil seperti "Infoa2z Berarti Semua Informasi"
// Kita perlu mengonversi string dalam huruf kecil juga, jika tidak, string itu tidak berfungsi dengan baik.

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#

Rakesh Dhiman
sumber
0

Inilah yang saya gunakan dan berfungsi untuk sebagian besar kasus kecuali jika pengguna memutuskan untuk menimpanya dengan menekan shift atau caps lock. Seperti pada keyboard Android dan 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
Dasith Wijes
sumber
0

Untuk mereka yang ingin melakukannya secara otomatis pada penekanan tombol, saya melakukannya dengan mengikuti kode di vb.net pada textboxcontrol khusus - Anda juga dapat melakukannya dengan kotak teks biasa - tapi saya suka kemungkinan untuk menambahkan kode berulang untuk kontrol tertentu melalui kontrol kustom yang sesuai dengan konsep 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
Andre Gotlieb
sumber
0

Bekerja dengan baik bahkan dengan kasing unta: 'someText di 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();
    }
}
Igor
sumber
0

Sebagai metode ekstensi:

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

Pemakaian:

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

Hasil:

Kebab Is Deliciou's ;d C...

Ricky Spanish
sumber
0

Alternatif dengan referensi ke Microsoft.VisualBasic(menangani string huruf besar juga):

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

Tanpa menggunakan 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())));

Itu loop melalui setiap huruf di setiap kata, mengubahnya menjadi huruf besar jika itu huruf pertama sebaliknya mengubahnya menjadi huruf kecil.

facepalm42
sumber
-1

Saya tahu ini pertanyaan lama tapi saya sedang mencari hal yang sama untuk C dan saya mengetahuinya jadi saya pikir saya akan mempostingnya jika orang lain mencari cara di 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;
}
Daveythewavey19
sumber