Gibt es eine einfache Möglichkeit, den ersten Buchstaben einer Zeichenfolge groß zu schreiben und den Rest zu senken? Gibt es eine eingebaute Methode oder muss ich meine eigene erstellen?
c#
string
capitalize
Mike Roosa
quelle
quelle
Antworten:
TextInfo.ToTitleCase()
Großschreibung des ersten Zeichens in jedem Token einer Zeichenfolge.Wenn es nicht erforderlich ist, das Akronym Uppercasing beizubehalten, sollten Sie einschließen
ToLower()
.Wenn CurrentCulture nicht verfügbar ist, verwenden Sie:
Eine detaillierte Beschreibung finden Sie im MSDN-Link .
quelle
quelle
sItem = Globalization.CultureInfo.CurrentCulture.TextInfo.ToTitleCase(sItem.ToLower) 'first char upper case
CurrentCulture
, wie können wir sicher sein , dass es keine Kultur, die dies anders behandelt?Der obige Code funktioniert nicht .....
Geben Sie also den folgenden Code ein, indem Sie ihn in einen niedrigeren Wert konvertieren, und wenden Sie dann die Funktion an
quelle
Es gibt einige Fälle,
CultureInfo.CurrentCulture.TextInfo.ToTitleCase
die nicht behandelt werden können, zum Beispiel den Apostroph'
.Ein regulärer Ausdruck kann auch verwendet werden
\b[a-zA-Z]
, um das Startzeichen eines Wortes nach einer Wortgrenze zu identifizieren.\b
Dann müssen wir die Übereinstimmung dank der folgendenRegex.Replace(string input,string pattern,MatchEvaluator evaluator)
Methode nur durch ihre Großbuchstabenäquivalenz ersetzen :Der Regex kann bei Bedarf angepasst werden, zum Beispiel, wenn wir die
MacDonald
undMcFry
Fälle behandeln möchten, aus denen der Regex wird:(?<=\b(?:mc|mac)?)[a-zA-Z]
Wenn wir mehr Präfixe verarbeiten müssen, müssen wir nur die Gruppe ändern
(?:mc|mac)
, um beispielsweise französische Präfixe hinzuzufügendu, de
:(?:mc|mac|du|de)
.Schließlich können wir erkennen, dass dieser Regex auch mit dem
MacDonald'S
letzten übereinstimmt,'s
sodass wir ihn im Regex mit einem negativen Blick nach hinten behandeln müssen(?<!'s\b)
. Am Ende haben wir:quelle
\b[ivxlcdm]+$|
Sie haben es also\b[ivxlcdm]+$|(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)
. Alle Endwörter eines Namens mit einem nicht strengen römischen Zahlenformat (ivxlcdm
) werden in Großbuchstaben geschrieben . Sie können jedoch einige unerwünschte Ergebnisse haben, zum Beispiel wird 'Li' zu 'LI'Regex.Replace("JOHN DOE".ToLower(), @"(?<=\b(?:mc|mac)?)[a-zA-Z](?<!'s\b)", m => m.Value.ToUpper())
Mc und Mac sind in den USA gebräuchliche Familiennamenpräfixe, und es gibt andere. TextInfo.ToTitleCase behandelt diese Fälle nicht und sollte nicht für diesen Zweck verwendet werden. So mache ich das:
quelle
ToTitleCase () sollte für Sie funktionieren.
http://support.microsoft.com/kb/312890
quelle
Die direkteste Option ist die Verwendung der in .NET verfügbaren ToTitleCase- Funktion, die sich die meiste Zeit um den Namen kümmern sollte. Wie edg hervorhob , gibt es einige Namen, für die es nicht funktioniert, aber diese sind ziemlich selten. Wenn Sie also nicht auf eine Kultur abzielen, in der solche Namen häufig vorkommen, ist es nicht notwendig, dass Sie sich zu viele Sorgen machen müssen.
Wenn Sie jedoch nicht mit einer .NET-Sprache arbeiten, hängt dies davon ab, wie die Eingabe aussieht. Wenn Sie zwei separate Felder für den Vor- und Nachnamen haben, können Sie einfach den ersten Buchstaben groß schreiben und den Rest mit verwenden Teilzeichenfolgen.
Wenn Sie jedoch mehrere Namen als Teil derselben Zeichenfolge erhalten, müssen Sie wissen, wie Sie die Informationen erhalten, und sie entsprechend aufteilen . Wenn Sie also einen Namen wie "John Doe" erhalten, teilen Sie die Zeichenfolge basierend auf dem Leerzeichen. Wenn es in einem Format wie "Doe, John" vorliegt, müssen Sie es anhand des Kommas aufteilen. Sobald Sie es jedoch aufgeteilt haben, wenden Sie einfach den zuvor gezeigten Code an.
quelle
CultureInfo.CurrentCulture.TextInfo.ToTitleCase ("mein Name");
gibt ~ Mein Name zurück
Das Problem besteht jedoch weiterhin bei Namen wie McFly, wie bereits erwähnt.
quelle
Ich benutze meine eigene Methode, um dies zu beheben:
Zum Beispiel der Satz: "Hallo Welt. Hallo, das ist die Stackoverflow-Welt." wird "Hallo Welt. Hallo, das ist die Stackoverflow-Welt." sein. Regex \ b (Wortanfang) \ w (erster Charakter des Wortes) macht den Trick.
quelle
Die Vorschläge zur Verwendung von ToTitleCase funktionieren nicht für Zeichenfolgen, die alle in Großbuchstaben geschrieben sind. Sie müssen also ToUpper für das erste Zeichen und ToLower für die verbleibenden Zeichen aufrufen.
quelle
Diese Klasse macht den Trick. Sie können dem statischen String-Array _prefixes neue Präfixe hinzufügen .
quelle
Wenn Sie vS2k8 verwenden, können Sie es mithilfe einer Erweiterungsmethode zur String-Klasse hinzufügen:
quelle
Char.ToUpper(input[0]) + input.Substring(1)
ist meiner Meinung nach besser lesbar.input.FirstLetterToUpper()
ist sicherlich mehr lesbar gegenChar.ToUpper(input[0]) + input.Substring(1)
, aber weniger transparentUm einige der Probleme zu umgehen, die hervorgehoben wurden, würde ich vorschlagen, die Zeichenfolge zuerst in Kleinbuchstaben umzuwandeln und dann die ToTitleCase-Methode aufzurufen. Sie können dann IndexOf ("Mc") oder IndexOf ("O \ '") verwenden, um Sonderfälle zu ermitteln, die besondere Aufmerksamkeit erfordern.
quelle
Ich mag diesen Weg:
Aus diesem MSDN-Artikel entnommen .
quelle
Hoffe das hilft dir.
quelle
quelle
Wie von edg angegeben, benötigen Sie einen komplexeren Algorithmus, um spezielle Namen zu verarbeiten (dies ist wahrscheinlich der Grund, warum viele Stellen alles in Großbuchstaben zwingen).
So etwas wie dieses ungetestete c # sollte den von Ihnen angeforderten einfachen Fall behandeln:
quelle