Es gibt zwei Hauptmechanismen zum Formatieren von Strings in C#/.NET: die Verwendung von String.Format() und die Stringinterpolation.
String.Format() nimmt einen String (in der Dokumentation als zusammengesetztes Format bezeichnet) entgegen, der aus festem Text und Platzhaltern (in der Dokumentation als Formatelemente bekannt) besteht, und dazu eine variable Anzahl von Argumenten. Der Rückgabewert löst jedes Formatelement anhand des zugehörigen Arguments 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
Dieser Mechanismus ist technisch als zusammengesetzte Formatierung bekannt.
Interpolierte Strings beginnen mit einem $ und enthalten Laufzeitausdrücke in geschweiften Klammern. Das Formatelement hat die folgende Syntax: $"{<interpolationExpression>}". Sie machen eine separate Argumentliste überflüssig. Das Ergebnis ist funktional äquivalent zum Mechanismus von String.Format().
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
Der Text in geschweiften Klammern, also Platzhalter beim zusammengesetzten Format und interpolierte Ausdrücke bei der Stringinterpolation, wird als Formatelement bezeichnet.
Ein Formatelement kann aus bis zu 3 Teilen bestehen. Der erste ist der obligatorische Ausdruck bzw. Argumentplatzhalter, wie im Beispielcode oben zu sehen. Darüber hinaus gibt es eine optionale Ausrichtung (eingeleitet mit einem Komma, „,“) und einen optionalen Format-String (eingeleitet mit einem Doppelpunkt, „:“).
{<interpolationExpression>[,<alignment>][:<formatString>]}
Die Ausrichtung legt die Länge des „Feldes“ fest, in das der Text gesetzt wird. Ist die Ausrichtung positiv, wird links mit Leerzeichen aufgefüllt, ist sie negativ, rechts.
Der Format-String legt die Form der Textausgabe fest, etwa ob bei einer Zahl Tausendertrennzeichen enthalten sein sollen oder ob von einem DateTime-Objekt nur der Datumsteil ausgegeben werden soll.
Der folgende Code zeigt die Ausgabe des Datumsanteils 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
Für Zahlen und Datumsangaben gibt es sowohl Standard- als auch benutzerdefinierte Formatierung. Es gibt keinen wesentlichen Unterschied zwischen benutzerdefiniert und Standard, außer dass du benutzerdefinierte Format-Strings aus Formatbuchstaben zusammensetzen kannst.
Jeder Thread hat eine Standardkultur Thread.CurrentThread.CurrentCulture, die in einer Instanz von CultureInfo gekapselt ist. Die Kultur des Threads bestimmt, wie Datumsangaben und Zahlen formatiert werden, und berücksichtigt dabei regionale Unterschiede wie die abweichenden üblichen Datumsformate im Vereinigten Königreich (DD/MM/YYYY) und in 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.
Verbatim-Strings ermöglichen mehrzeilige Strings. Sie werden mit einem @ eingeleitet.
string str = @"
See no wretched
quotes everywhere
";
In dieser Übung hilfst du Highschool-Pärchen, ihre Liebe in den sozialen Medien zu bekunden.
Implementiere die statische Methode HighSchoolSweethearts.DisplaySingleLine(), die zwei Namen entgegennimmt und sie durch ein Herz getrennt anzeigt.
Der formatierte Text soll 61 Zeichen breit sein, wobei das Herz in der Mitte des Strings steht.
Alle Namen passen garantiert gut in die Breite der Zeile.
HighSchoolSweethearts.DisplaySingleLine("Lance Green", "Pat Riley");
// => " Lance Green ♡ Pat Riley "
Implementiere die statische Methode HighSchoolSweethearts.DisplayBanner(), die die beiden Initialenpaare getrennt durch ein Pluszeichen anzeigt.
HighSchoolSweethearts.DisplayBanner("L. G.", "P. R.");
// see the ascii art below
****** ******
** ** ** **
** ** ** **
** * **
** **
** L. G. + P. R. **
** **
** **
** **
** **
** **
** **
***
*
Implementiere die statische Methode HighSchoolSweethearts.DisplayGermanExchangeStudents(), die das Startdatum der Beziehung und die Dauer für unsere deutschen Austauschschüler anzeigt.
HighSchoolSweethearts.DisplayGermanExchangeStudents("Norbert", "Heidi", new DateTime(2019, 1, 22), 1535.22f);
// => "Norbert and Heidi have been dating since 22.01.2019 - that's 1.535,22 hours"
Melde dich bei Exercism an, um C# mit 62 Konzepte178 Übungen und echtem menschlichen Mentoring zu lernen und zu meistern, alles kostenlos.