Tracks
/
C#
C#
/
Lehrplan
/
String-Formatierung
St

String-Formatierung in C#

13 Übungen

Über String-Formatierung

In C#/.NET gibt es viele verschiedene Mechanismen zum Formatieren von Strings: von der einfachen Verkettung von Objekten über Aufrufe der überschriebenen object.ToString()-Methode bis hin zur Verwendung von ICustomFormatter (wird in dieser Übung nicht behandelt).

Die beiden gebräuchlichsten Mechanismen zum Formatieren von Strings sind die Stringinterpolation und String.Format(). Die Klasse StringBuilder (cross-ref-tba) kann ebenfalls verwendet werden, um einen String aufzubauen, wenn es komplex wird, etwa bei mehreren Zeilen.

ToString() verwenden

System.Object(), von dem alle Klassen und Strukturen erben, hat eine ToString()-Methode. Zum Beispiel gibt new DateTime(2019, 5, 23).ToString() „05/23/2019 00:00:00“ zurück (in einem Thread mit US-Kultur, siehe unten). Es gibt Situationen wie die Stringverkettung, in denen diese Standard-ToString()-Methode implizit aufgerufen wird; "" + new DateTime(2019, 5, 23) liefert dasselbe Ergebnis.

Zusätzlich zur Standard-ToString()-Methode haben Typen, bei denen die Formatierung eine Rolle spielt, Überladungen, die eine Formatzeichenfolge oder sogar einen Formatanbieter entgegennehmen. In der BCL (Base Class Library) sind das insbesondere Zahlen, Datumsangaben, Enumerationen und GUIDs.

Zusammengesetzte Formatierung

String.Format() nimmt einen String (in der Dokumentation als zusammengesetztes Format bezeichnet), der aus festem Text und Platzhaltern (in der Dokumentation als Formatelemente bekannt) sowie einer variablen Anzahl von Argumenten besteht. Der Rückgabewert löst jedes Formatelement mit dem entsprechenden Argument auf und kombiniert die aufgelösten Werte mit dem festen Text.

string.Format("I had {0} bitcoins on {1}, the day I forgot my password.", 55.5, new DateTime(2010, 2, 25))
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Format() kann die bessere Wahl gegenüber der Interpolation sein, wenn das Format in mehreren Ausdrücken als eine Art Vorlage verwendet wird oder wenn es zu umständlich ist, das Format und die zu formatierenden Ausdrücke zusammenzubringen, etwa bei [wörtlichen Zeichenfolgen][verbatim-strings].

Dieser Mechanismus ist technisch als zusammengesetzte Formatierung bekannt.

Eine ausführlichere Liste der String-erzeugenden Methoden, die zusammengesetzte Formatierung nutzen, findest du in diesem Artikel.

Stringinterpolation

Interpolierte Strings beginnen mit einem $ und enthalten Laufzeitausdrücke in geschweiften Klammern. Das Formatelement hat die folgende Syntax: $"{<interpolationExpression>[,<alignment>][:<formatString>]}". Dadurch entfällt die Notwendigkeit einer separaten Argumentliste. Das Ergebnis ist funktional äquivalent zum Mechanismus von String.Format().

Der Ausdruck kann alles umfassen, was im Gültigkeitsbereich liegt. Alignment ist die Länge des „Feldes“, in dem der Text steht. Ist die Alignment positiv, wird der Text links mit Leerzeichen aufgefüllt; ist sie negativ, steht die Auffüllung rechts vom Text.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf} bitcoins on {thatDay}, the day I forgot my password."
// => "I had 55.5 bitcoins on 2/25/2010 00:00:00, the day I forgot my password." - US settings

Formatelemente

Der Text in geschweiften Klammern, also Platzhalter bei der zusammengesetzten Formatierung und interpolierte Ausdrücke bei der Stringinterpolation, wird als Formatelement bezeichnet.

Ein Formatelement kann aus bis zu 3 Teilen bestehen. Der erste ist der erforderliche Ausdruck oder Argumentplatzhalter, wie im Beispielcode oben zu sehen. Darüber hinaus gibt es eine optionale Ausrichtung (eingeleitet durch ein Komma, „,“) und eine optionale Formatzeichenfolge (eingeleitet durch einen Doppelpunkt, „:“).

{<interpolationExpression>[,<alignment>][:<formatString>]}

Die Alignment legt die Länge des „Feldes“ fest, in das der Text gesetzt wird. Ist die Ausrichtung positiv, wird links mit Leerzeichen aufgefüllt, andernfalls rechts.

Die Formatzeichenfolge legt die Form der Textausgabe fest, zum Beispiel ob bei einer Zahl Tausendertrennzeichen eingefügt werden sollen oder ob nur der Datumsteil eines DateTime-Objekts ausgegeben werden soll.

Der folgende Code zeigt die Anzeige des Datumsteils eines DateTime-Objekts und einer Gleitkommazahl in Exponentialform.

var loadsOf = 55.5;
var thatDay = new DateTime(2010, 2, 25);
$"I had {loadsOf:E} bitcoins on {thatDay:d}, the day I forgot my password."
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

string.Format(
    "I had {0:E} bitcoins on {1:d}, the day I forgot my password.",
    loadsOf, thatDay)
// => I had 5.550000E+001 bitcoins on 02/25/2010, the day I forgot my password. - US settings

Es gibt sowohl Standard- als auch benutzerdefinierte Formatierung für Zahlen und Datumsangaben. Es gibt keinen wesentlichen Unterschied zwischen benutzerdefiniert und Standard, außer dass du benutzerdefinierte Formatzeichenfolgen aus Formatzeichen zusammensetzen kannst. „Benutzerdefiniert“ hat in diesem Zusammenhang nichts mit der Schnittstelle ICustomFormatter zu tun, die verwendet wird, wenn du deine eigenen benutzerdefinierten Formatierer entwickelst.

BCL-Formatierer und Formatzeichenfolgen

Die Base Class Library (BCL) stellt 2 Formatierer bereit: DateTimeFormatInfo und NumberFormatInfo, sowie 6 Gruppen von Formatzeichenfolgen.

Die verschiedenen Listen der Formatzeichenfolgen findest du unten:

Die Formatzeichenfolgen für Enum und GUID können als Standard eingeordnet werden. Obwohl enum und GUID ToString()-Überladungen haben, die ein IFormatProvider entgegennehmen, ist nicht klar, ob es dort etwas bewirkt.

In der Bibliothek wird versucht, den Formatzeichenfolgen eine gewisse Konsistenz zu geben (über die Tatsache hinaus, dass sie als Strings dargestellt werden). Dieses Bestreben nach Konsistenz zeigt sich in den Standardzeichenfolgen. In der Praxis kümmert es dich als Entwickler selten, worin sich Standard- und benutzerdefinierte Zeichenfolgen unterscheiden. Wenn du Formatierer für deine eigenen Klassen implementierst, ist es zwar eine gute Idee, die vorhandenen Standardzeichenfolgen zu übernehmen, falls deine Klassen danach verlangen, aber ansonsten kannst du den Unterschied getrost ignorieren.

Kultur

Jeder Ausführungsthread hat eine Standardkultur Thread.CurrentThread.CurrentCulture, die in einer Instanz von CultureInfo gekapselt ist. Die Kultur des Threads bestimmt, wie Datumsangaben und Zahlen standardmäßig formatiert werden, abhängig von regionalen Unterschieden wie dem abweichenden üblichen Datumsformat zwischen dem Vereinigten Königreich DD/MM/YYYY und den USA MM/DD/YYYY.

CultureInfo implementiert die Schnittstelle IFormatProvider, die an bestimmte Überladungen von String.Format() übergeben werden kann. Damit kannst du die Kultur des Threads überschreiben.

Referenzmaterial

Über GitHub bearbeiten Der Link öffnet sich in einem neuen Fenster oder Tab

Lerne String-Formatierung

Das Üben ist gesperrt

Schalte 11 weitere Übungen frei, um String-Formatierung zu üben