Konvertieren einer Zeichenfolge in Groß- und Kleinschreibung


300

Ich habe eine Zeichenfolge, die Wörter in einer Mischung aus Groß- und Kleinbuchstaben enthält.

Zum Beispiel: string myData = "a Simple string";

Ich muss das erste Zeichen jedes Wortes (durch Leerzeichen getrennt) in Großbuchstaben umwandeln. Also möchte ich das Ergebnis wie folgt:string myData ="A Simple String";

Gibt es eine einfache Möglichkeit, dies zu tun? Ich möchte den String nicht teilen und die Konvertierung durchführen (das wird mein letzter Ausweg sein). Es ist auch garantiert, dass die Zeichenfolgen in Englisch sind.


1
http://support.microsoft.com/kb/312890 - So konvertieren Sie Zeichenfolgen mit Visual C #
ttarchala

Antworten:


538

MSDN: TextInfo.ToTitleCase

Stellen Sie sicher, dass Sie Folgendes angeben: 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
Wahr. Wenn ein Wort nur in Großbuchstaben geschrieben ist, funktioniert es nicht. zB - "Ein FBI-Agent hat meinen Hund erschossen" -> "Ein FBI-Agent hat meinen Hund erschossen". Und es geht nicht um "McDonalds" und so weiter.
Kobi

5
@Kirschstein diese Funktion tut diese Worte Titel Fall conver, obwohl auch sie sollten in englischer Sprache nicht. Siehe Dokumentation : Actual result: "War And Peace".
Kobi

5
@simbolo - Ich habe es tatsächlich nicht in einem Kommentar erwähnt ... Sie können so etwas wie verwenden text = Regex.Replace(text, @"(?<!\S)\p{Ll}", m => m.Value.ToUpper());, aber es ist alles andere als perfekt. Zum Beispiel werden Anführungszeichen oder Klammern immer noch nicht verarbeitet - "(one two three)"-> "(one Two Three)". Möglicherweise möchten Sie eine neue Frage stellen, nachdem Sie genau herausgefunden haben, was Sie mit diesen Fällen tun möchten.
Kobi

17
Aus irgendeinem Grund , wenn ich „DR“ haben es nicht „Dr“ nicht werden , es sei denn ich .ToLower () aufrufen , bevor ToTitleCase () aufrufen ... das ist also etwas aufpassen für ...
Tod Thomson

16
Ein .ToLower () zur Eingabe einer Zeichenfolge ist erforderlich, wenn der Eingabetext in Großbuchstaben geschrieben ist
Puneet Ghanshani,

137

Versuche dies:

string myText = "a Simple string";

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

Wie bereits erwähnt, liefert die Verwendung von TextInfo.ToTitleCase möglicherweise nicht genau die gewünschten Ergebnisse. Wenn Sie mehr Kontrolle über die Ausgabe benötigen, können Sie Folgendes tun:

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

Und dann benutze es so:

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

1
Ich habe verschiedene Variationen des TextInfo-Objekts ausprobiert - keine Fehler, aber die ursprüngliche Zeichenfolge (Großbuchstaben) wurde nie aktualisiert. Steckte diese Methode ein und bin sehr dankbar.
JustSteve

6
@justSteve von MSDN ( msdn.microsoft.com/en-us/library/… ): "Diese Methode bietet derzeit jedoch keine korrekte Groß- und Kleinschreibung, um ein Wort zu konvertieren, das vollständig in Großbuchstaben geschrieben ist, z. B. ein Akronym." nur ToLower () es zuerst (ich weiß, das ist alt, aber nur für den Fall, dass jemand anderes darauf stolpert und sich fragt, warum!)
Nizmow

Nur verfügbar für .NET Framework 4.7.2 <= Ihre Rahmenarbeit <= .NET Core 2.0
Paul Gorbas

70

Noch eine Variation. Basierend auf mehreren Tipps hier habe ich es auf diese Erweiterungsmethode reduziert, die für meine Zwecke hervorragend funktioniert:

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

8
CultureInfo.InvariantCulture.TextInfo.ToTitleCase (s.ToLower ()); würde eigentlich besser passen!
Puneet Ghanshani

Nur verfügbar für .NET Framework 4.7.2 <= Ihre Rahmenarbeit <= .NET Core 2.0
Paul Gorbas

Da wir InvariantCulture für TitleCasing verwenden, sollte s.ToLowerInvariant () anstelle von s.ToLower () verwendet werden.
Vinigas

27

Persönlich habe ich die TextInfo.ToTitleCaseMethode ausprobiert , aber ich verstehe nicht, warum sie nicht funktioniert, wenn alle Zeichen in Großbuchstaben geschrieben sind.

Obwohl mir die von Winston Smith bereitgestellte util-Funktion gefällt, möchte ich die Funktion bereitstellen, die ich derzeit verwende:

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

Das Spiel mit einigen Tests Strings:

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

Geben Ausgabe :

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

1
@harsh: "hässliche" Lösung würde ich sagen ... macht für mich keinen Sinn, dass Sie zuerst den gesamten String in Kleinbuchstaben konvertieren müssen.
Luis Quijada

4
Es ist beabsichtigt, denn wenn Sie beispielsweise nach "UNICEF and Charity" fragen, um den Titel zu erhalten, möchten Sie nicht, dass es in Unicef ​​geändert wird.
Casey

4
Anstatt ToLower()die gesamte Zeichenfolge aufzurufen , möchten Sie diese Arbeit lieber selbst erledigen und für jedes einzelne Zeichen dieselbe Funktion aufrufen? Es ist nicht nur eine hässliche Lösung, es bietet auch keinen Nutzen und würde sogar länger dauern als die eingebaute Funktion.
Krillgar

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

1
@ruffin Nein. Teilzeichenfolge mit einem einzelnen int-Parameter beginnt am angegebenen Index und gibt alles bis zum Ende der Zeichenfolge zurück.
Krillgar

21

Kürzlich habe ich eine bessere Lösung gefunden.

Wenn Ihr Text jeden Buchstaben in Großbuchstaben enthält, konvertiert TextInfo ihn nicht in die richtige Groß- und Kleinschreibung. Wir können das beheben, indem wir die darin enthaltene Kleinbuchstabenfunktion folgendermaßen verwenden:

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

Dies konvertiert nun alles, was in Propercase eingeht.


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

1
Ich finde es gut, dass Sie den ToLower vor ToTitleCase hinzugefügt haben, der die Situation abdeckt, in der der Eingabetext nur aus Großbuchstaben besteht.
Joel

7

Wenn jemand an der Lösung für Compact Framework interessiert ist:

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

Mit der String-Interpolation: return string.Join ("", text.Split ('') .Select (i => $ "{i.Substring (0, 1) .ToUpper ()} {i.Substring (1). ToLower ()} ") .ToArray ());
Ted

6

Hier ist die Lösung für dieses Problem ...

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

5

Verwenden Sie ToLower()zuerst als CultureInfo.CurrentCulture.TextInfo.ToTitleCasefür das Ergebnis, um die richtige Ausgabe zu erhalten.

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

Ich brauchte einen Weg, um mit allen Großbuchstaben umzugehen, und ich mochte die Lösung von Ricky AH, aber ich ging noch einen Schritt weiter, um sie als Erweiterungsmethode zu implementieren. Dies vermeidet den Schritt, dass Sie Ihr Zeichenarray erstellen und dann jedes Mal explizit ToArray darauf aufrufen müssen. Sie können es also einfach in der Zeichenfolge aufrufen, wie folgt:

Verwendung:

string newString = oldString.ToProper();

Code:

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
Fügte einfach eine weitere ODER-Bedingung hinzu, wenn (c == '' || c == '\' ') ... manchmal enthalten Namen Apostrophe (').
JSK

2

Es ist besser zu verstehen, indem Sie Ihren eigenen Code ausprobieren ...

Weiterlesen

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

1) Konvertieren Sie einen String in Großbuchstaben

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

2) Konvertieren Sie eine Zeichenfolge in Kleinbuchstaben

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

3) Konvertieren Sie einen String in TitleCase

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

1

Hier ist eine Implementierung, Zeichen für Zeichen. Sollte mit "(One Two Three)" funktionieren

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

Mit dieser einfachen Methode können Sie Text oder Zeichenfolge direkt in die richtige ändern, nachdem Sie nach null oder leeren Zeichenfolgenwerten gesucht haben, um Fehler zu vermeiden:

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

Versuche dies:

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


Rufen Sie diese Methode im TextChanged-Ereignis der TextBox auf.


0

Ich habe die obigen Referenzen verwendet und die vollständige Lösung lautet: -

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

// Benötige ein Ergebnis wie "Infoa2z bedeutet alle Informationen"
// Wir müssen den String auch in Kleinbuchstaben konvertieren, sonst funktioniert er nicht richtig.

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

Dies ist, was ich benutze und es funktioniert in den meisten Fällen, es sei denn, der Benutzer beschließt, es durch Drücken von Shift oder Feststelltaste zu überschreiben. Wie auf Android- und iOS-Tastaturen.

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

Für diejenigen, die es automatisch per Tastendruck tun möchten, habe ich es mit folgendem Code in vb.net auf einem benutzerdefinierten Textfeld-Steuerelement gemacht - Sie können es natürlich auch mit einem normalen Textfeld tun -, aber ich mag die Möglichkeit, wiederkehrenden Code für bestimmte Steuerelemente hinzuzufügen Über benutzerdefinierte Steuerelemente passt es zum Konzept von 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

Funktioniert auch mit Kamelhülle: '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

Als Erweiterungsmethode:

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

Verwendungszweck:

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

Ergebnis:

Kebab Is Deliciou's ;d C...



0

Ohne zu verwenden 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())));

Es durchläuft jeden Buchstaben in jedem Wort und wandelt ihn in Großbuchstaben um, wenn es der erste Buchstabe ist, andernfalls wird er in Kleinbuchstaben umgewandelt.


-1

Ich weiß, dass dies eine alte Frage ist, aber ich habe nach dem gleichen Thema für C gesucht und es herausgefunden, also dachte ich, ich würde es posten, wenn jemand anderes nach einem Weg in C sucht:

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.