Dizeyi başlık vakasına dönüştürme


300

Büyük ve küçük harflerin bir karışımında kelimeler içeren bir dize var.

Örneğin: string myData = "a Simple string";

Her kelimenin ilk karakterini (boşluklarla ayrılmış) büyük harfe dönüştürmem gerekiyor. Yani sonucu şöyle istiyorum:string myData ="A Simple String";

Bunu yapmanın kolay bir yolu var mı? Ben dize bölmek ve (bu benim son çare olacak) dönüşüm yapmak istemiyorum. Ayrıca, dizelerin İngilizce olduğu garanti edilir.


1
http://support.microsoft.com/kb/312890 - Visual C # kullanarak dizeleri alt, üst veya başlık (uygun) duruma dönüştürme
ttarchala

Yanıtlar:


538

MSDN: TextInfo.ToTitleCase

Eklediğinizden emin olun: 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
Doğru. Ayrıca, bir kelimenin tamamı büyük harfse işe yaramaz. örneğin - "bir FBI ajanı DOG'umu vurdu" -> "Bir FBI ajanı DOG'umu vurdu". Ve "McDonalds" ve benzeri işlemez.
Kobi

5
Bu fonksiyon @Kirschstein yapar harfler büyük olacak şekilde şu sözlerle formatına dönüştürülmüş, onlar İngilizce olmamalı rağmen. Belgelere bakın: Actual result: "War And Peace".
Kobi

5
@simbolo - Bir yorumda bahsetmiştim ... Gibi bir şey kullanabilirsiniz text = Regex.Replace(text, @"(?<!\S)\p{Ll}", m => m.Value.ToUpper());, ama mükemmel olmaktan uzak. Örneğin, hala tırnak işaretleri veya parantezleri işlemez - "(one two three)"-> "(one Two Three)". Bu vakalarla tam olarak ne yapmak istediğinizi anladıktan sonra yeni bir soru sormak isteyebilirsiniz.
Kobi

17
Neden "DR" olduğunda ToTitleCase () çağırmadan önce .ToLower () çağırmadan sürece "Dr" olmaz ... Yani bu dikkat edilmesi gereken bir şey ...
Tod Thomson

16
Giriş metninin büyük harf olması durumunda giriş dizgisine bir .ToLower () gerekir
Puneet Ghanshani

137

Bunu dene:

string myText = "a Simple string";

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

Daha önce de belirtildiği gibi, TextInfo.ToTitleCase kullanmak size tam olarak istediğiniz sonuçları vermeyebilir. Çıktı üzerinde daha fazla kontrole ihtiyacınız varsa, böyle bir şey yapabilirsiniz:

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

Ve sonra şöyle kullanın:

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

1
TextInfo nesnesinin birkaç varyasyonunu denedim - hata yok ama orijinal dize (büyük harf) asla güncellenmedi. Bu yöntemi takın ve çok minnettarım.
justSteve

6
@justSteve, MSDN'den ( msdn.microsoft.com/en-us/library/… ): "Ancak, bu yöntem şu anda bir kısaltma gibi tamamen büyük harfli bir kelimeyi dönüştürmek için şu anda uygun muhafaza sağlamaz" - muhtemelen sadece ToLower () önce (bunun eski olduğunu biliyorum, ama bir başkasının tökezlemesi ve nedenini merak etmesi durumunda!)
nizmow

Yalnızca .NET Framework 4.7.2 için kullanılabilir <= çerçeve işiniz <= .NET Core 2.0
Paul Gorbas

70

Yine başka bir varyasyon. Burada birkaç ipucuna dayanarak, bunu benim amacım için harika olan bu uzantı yöntemine indirgedim:

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

8
CultureInfo.InvariantCulture.TextInfo.ToTitleCase (s.ToLower ()); aslında daha iyi olurdu!
Puneet Ghanshani

Yalnızca .NET Framework 4.7.2 için kullanılabilir <= çerçeve işiniz <= .NET Core 2.0
Paul Gorbas

TitleCasing için InvariantCulture kullandığımız için, s.ToLower () yerine s.ToLowerInvariant () kullanılmalıdır.
Vinigas

27

Şahsen TextInfo.ToTitleCaseyöntemi denedim , ama, tüm karakterler üst kasalı olduğunda neden işe yaramadığını anlamıyorum.

Winston Smith tarafından sağlanan util işlevini beğenmeme rağmen , şu anda kullandığım işlevi sağlamama izin verin:

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

Bazı test dizileri ile oynama:

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

Çıktı vermek :

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

1
@harsh: "çirkin" çözüm söyleyebilirim ... benim için tüm dizeyi küçük harfe dönüştürmeniz gerektiği anlamına gelmez.
Luis Quijada

4
Bu kasıtlıdır, çünkü "UNICEF ve sadaka" nın başlık kasası olmasını istersen, Unicef ​​olarak değiştirilmesini istemezsin.
Casey

4
Yani ToLower(), tüm dizeyi çağırmak yerine , tüm bunları kendiniz yapmak ve her bir karakter için aynı işlevi çağırmak mı istiyorsunuz? Sadece çirkin bir çözüm değil, aynı zamanda sıfır fayda sağlıyor ve yerleşik fonksiyondan daha uzun sürecek.
krillgar

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

1
Tek int parametresine sahip alt dize verilen dizinde başlar ve her şeyi dizenin sonuna döndürür.
krillgar

21

Son zamanlarda daha iyi bir çözüm buldum.

Metniniz her harf büyük harf içeriyorsa, TextInfo bunu büyük / küçük harfe dönüştürmez. Bunu, içindeki küçük harf işlevini kullanarak şu şekilde düzeltebiliriz:

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

Şimdi gelen her şey Propercase'e dönüştürülecek.


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

1
ToTower ToTitleCase'den önce eklediğiniz gibi, giriş metninin tüm büyük harflerle kapandığı durumu kapsar.
joelc

7

Birisi Compact Framework çözümüyle ilgileniyorsa:

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

Dize enterpolasyonu ile: return string.Join ("", text.Split (''). (İ => $ "{i.Substring (0, 1) .ToUpper ()} {i.Substring (1) öğesini seçin. ToLower ()} ") .ToArray ());
Ted

6

İşte bu sorunun çözümü ...

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

5

Doğru çıktıyı elde etmek için önce sonuca ToLower()göre kullanın 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

Tüm büyük harflerle başa çıkmak için bir yola ihtiyacım vardı ve Ricky AH'nin çözümünü beğendim, ancak bir uzatma yöntemi olarak uygulamak için bir adım daha attım. Bu, karakter dizinizi oluşturmak ve ardından her seferinde açıkça ToArray'ı çağırmak adımını önler - böylece sadece dizede çağırabilirsiniz, şöyle:

kullanımı:

string newString = oldString.ToProper();

kod:

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 == '\' ') ... bazen isimler kesme işareti (') içeriyorsa, bir VEYA koşulu daha ekledim.
JSK

2

Kendi kodunuzu deneyerek anlamak daha iyi ...

Daha fazla oku

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

1) Bir Dizeyi Büyük Harfe Dönüştür

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

2) Bir Dizeyi Küçük Harfe Dönüştür

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

3) Bir Dizeyi TitleCase'e Dönüştür

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

1

İşte karakter karakter bir uygulama. "(Bir İki Üç)" ile çalışmalı

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

Hataları ortadan kaldırmak için null veya boş dize değerlerini kontrol ettikten sonra bu basit yöntemi kullanarak metni veya dizeyi doğrudan doğru olarak değiştirebilirsiniz:

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

Bunu dene:

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'ın TextChanged olayında bu yöntemi çağırın.



0

Bu benim kullandığım şeydir ve kullanıcı üst karakter veya büyük harf kilidine basarak geçersiz kılmaya karar vermedikçe çoğu durumda çalışır. Android ve iOS klavyelerde olduğu gibi.

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 üzerinde otomatik olarak yapmak isteyenler için özel bir textboxcontrol üzerinde vb.net aşağıdaki kodu ile yaptım - tabii ki normal bir metin kutusu ile de yapabilirsiniz - ama belirli kontroller için tekrarlayan kod ekleme imkanı gibi Özel kontrollerle OOP konseptine uygundur.

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

Deve durumunda bile iyi çalışır: 'YourPage'inizde someText'

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

Bir uzantı yöntemi olarak:

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

Kullanımı:

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

Sonuç:

Kebab Is Deliciou's ;d C...


0

Referans olarak alternatif Microsoft.VisualBasic(büyük harf dizelerini de işler):

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

0

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

Her kelimedeki her harf arasında dolaşır, eğer ilk harfse büyük harfe dönüştürür, aksi takdirde küçük harfe dönüştürür.


-1

Bu eski bir soruyu biliyorum ama C için aynı şeyi arıyordum ve bunu anladım, bu yüzden başka biri C'de bir yol arıyorsa gönderirim diye düşündüm:

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;
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.