Frage

Wie formatiere ich eine Zeichenfolge in Titel Fall?

Keine korrekte Lösung

Andere Tipps

Hier ist eine einfache statische Methode, um dies in C# zu tun:

public static string ToTitleCaseInvariant(string targetString)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(targetString);
}

Ich würde mich davor hüten, automatisch alle Wörter mit vorangestelltem Leerzeichen in Großbuchstaben zu schreiben, wenn ich Gefahr laufen würde, den Zorn von Nitpickern auf mich zu ziehen.

Ich würde zumindest darüber nachdenken, ein Wörterbuch für Ausnahmefälle wie Artikel und Konjunktionen zu implementieren.Erblicken:

"Die Schöne und das Biest"

Und wenn es um Eigennamen geht, wird die Sache noch viel hässlicher.

Hier ist eine Perl-Lösung http://daringfireball.net/2008/05/title_case

Hier ist eine Ruby-Lösung http://frankschmitt.org/projects/title-case

Hier ist eine Ruby-Einzeilerlösung: http://snippets.dzone.com/posts/show/4702

'some string here'.gsub(/\b\w/){$&.upcase}

Was der Einzeiler tut, ist die Verwendung eines regulären Ausdrucks, der das erste Zeichen jedes Wortes durch die Großbuchstabenversion davon ersetzt.

Um es beispielsweise in C zu aktivieren, verwenden Sie die ASCII-Codes (http://www.asciitable.com/), um den ganzzahligen Wert des Zeichens zu ermitteln und 32 davon zu subtrahieren.

Dies ist eine schlechte Lösung, wenn Sie jemals vorhaben, Zeichen über A-Z und A-Z hinaus zu akzeptieren.

Zum Beispiel:ASCII 134:å, ASCII 143:A.
Durch die Verwendung von Arithmetik erhalten Sie:ASCII 102:F

Verwenden Sie Bibliotheksaufrufe. Gehen Sie nicht davon aus, dass Sie Ganzzahlarithmetik für Ihre Zeichen verwenden können, um etwas Nützliches zurückzubekommen.Unicode ist knifflig.

In Silverlight gibt es keine ToTitleCase im TextInfo Klasse.

Hier ist eine einfache Regex-basierte Methode.

Notiz:Silverlight verfügt über keine vorkompilierten regulären Ausdrücke, aber für mich ist dieser Leistungsverlust kein Problem.

    public string TitleCase(string str)
    {
        return Regex.Replace(str, @"\w+", (m) =>
        {
            string tmp = m.Value;
            return char.ToUpper(tmp[0]) + tmp.Substring(1, tmp.Length - 1).ToLower();
        });
    }

In Perl:

$string =~ s/(\w+)/\u\L$1/g;

Das steht sogar in den FAQ.

Wenn die von Ihnen verwendete Sprache über eine unterstützte Methode/Funktion verfügt, verwenden Sie diese einfach (wie in C#). ToTitleCase Methode)

Wenn dies nicht der Fall ist, sollten Sie Folgendes tun:

  1. Lesen Sie die Zeichenfolge ein
  2. Nimm das erste Wort
  3. Schreiben Sie den ersten Buchstaben dieses Wortes groß 1
  4. Gehen Sie vorwärts und finden Sie das nächste Wort
  5. Gehen Sie zu 3, wenn nicht am Ende der Zeichenfolge, andernfalls beenden Sie den Vorgang

1 Um es beispielsweise in C groß zu schreiben, verwenden Sie das ASCII-Codes um den ganzzahligen Wert des Zeichens zu ermitteln und 32 davon zu subtrahieren.

Es müsste viel mehr Fehlerprüfung im Code durchgeführt werden (um sicherzustellen, dass gültige Buchstaben usw. sind), und die Funktion „Großschreibung“ muss den Buchstaben eine Art „Titel-Groß-/Kleinschreibung“ auferlegen, um nach Wörtern zu suchen, die nicht benötigt werden befähigt werden ('und', 'aber' usw.) Hier ist ein gutes Schema)

In welcher Sprache?

In PHP ist es:

ucwords()

Beispiel:

$HelloWorld = ucwords('hello world');

In Java können Sie den folgenden Code verwenden.

public String titleCase(String str) {
    char[] chars = str.toCharArray();
    for (int i = 0; i < chars.length; i++) {
        if (i == 0) {
            chars[i] = Character.toUpperCase(chars[i]);
        } else if ((i + 1) < chars.length && chars[i] == ' ') {
            chars[i + 1] = Character.toUpperCase(chars[i + 1]);
        }
    }
    return new String(chars);
}

Excel-ähnliches RICHTIGES:

public static string ExcelProper(string s) {
    bool upper_needed = true;
    string result = "";
    foreach (char c in s) {
        bool is_letter = Char.IsLetter(c);
        if (is_letter)
            if (upper_needed)
                result += Char.ToUpper(c);
            else
                result += Char.ToLower(c);
        else
            result += c;
        upper_needed = !is_letter;
    }
    return result;
}

http://titlecase.com/ hat eine API

Es gibt eine integrierte Formel PROPER(n) in Excel.

Es hat mich sehr gefreut, dass ich es nicht selbst schreiben musste!

Hier ist eine Implementierung in Python: https://launchpad.net/titlecase.py

Und eine Portierung dieser Implementierung, die ich gerade in C++ erstellt habe: http://codepad.org/RrfcsZzO

Ich denke, dass die Verwendung von CultureInfo nicht immer zuverlässig ist. Dies ist die einfache und praktische Möglichkeit, Zeichenfolgen manuell zu bearbeiten:

string sourceName = txtTextBox.Text.ToLower();
string destinationName = sourceName[0].ToUpper();

for (int i = 0; i < (sourceName.Length - 1); i++) {
  if (sourceName[i + 1] == "")  {
    destinationName += sourceName[i + 1];
  }
  else {
    destinationName += sourceName[i + 1];
  }
}
txtTextBox.Text = desinationName;

Hier ist ein einfaches Beispiel dafür:

public static string ToTitleCaseInvariant(string str)
{
    return System.Threading.Thread.CurrentThread.CurrentCulture.TextInfo.ToTitleCase(str);
}

Ohne eine vorgefertigte Funktion zu verwenden, ein supereinfacher Low-Level-Algorithmus zum Konvertieren einer Zeichenfolge in die Groß-/Kleinschreibung des Titels:


convert first character to uppercase.
for each character in string,
    if the previous character is whitespace,
        convert character to uppercase.

Dies setzt voraus, dass „Zeichen in Großbuchstaben umwandeln“ dies korrekt erledigt, unabhängig davon, ob bei dem Zeichen die Groß-/Kleinschreibung beachtet wird oder nicht (z. B. „+“).

Hier haben Sie eine C++-Version.Es enthält eine Reihe von Wörtern, die nicht in Großbuchstaben geschrieben werden können, wie Prononunen und Präpositionen.Ich würde jedoch nicht empfehlen, diesen Prozess zu automatisieren, wenn Sie wichtige Texte bearbeiten müssen.

#include <iostream>
#include <string>
#include <vector>
#include <cctype>
#include <set>

using namespace std;

typedef vector<pair<string, int> > subDivision;
set<string> nonUpperCaseAble;

subDivision split(string & cadena, string delim = " "){
    subDivision retorno;
    int pos, inic = 0;
    while((pos = cadena.find_first_of(delim, inic)) != cadena.npos){
        if(pos-inic > 0){
            retorno.push_back(make_pair(cadena.substr(inic, pos-inic), inic));
        }
        inic = pos+1;
    }
    if(inic != cadena.length()){
        retorno.push_back(make_pair(cadena.substr(inic, cadena.length() - inic), inic));
    }
    return retorno;
}

string firstUpper (string & pal){
    pal[0] = toupper(pal[0]);
    return pal;
}

int main()
{
    nonUpperCaseAble.insert("the");
    nonUpperCaseAble.insert("of");
    nonUpperCaseAble.insert("in");
    // ...

    string linea, resultado;
    cout << "Type the line you want to convert: " << endl;
    getline(cin, linea);

    subDivision trozos = split(linea);
    for(int i = 0; i < trozos.size(); i++){
        if(trozos[i].second == 0)
        {
            resultado += firstUpper(trozos[i].first);
        }
        else if (linea[trozos[i].second-1] == ' ')
        {
            if(nonUpperCaseAble.find(trozos[i].first) == nonUpperCaseAble.end())
            {
                resultado += " " + firstUpper(trozos[i].first);
            }else{
                resultado += " " + trozos[i].first;
            }
        }
        else
        {
            resultado += trozos[i].first;
        }       
    }

    cout << resultado << endl;
    getchar();
    return 0;
}

Mit Perl könnten Sie Folgendes tun:

my $tc_string = join ' ', map { ucfirst($\_) } split /\s+/, $string;
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top