Dieses kleine Tut geht um die String.Format-Methode - jeder kennt sie, keiner liebt sie (ich zumindest nicht).
Eigentlich eine geniale Methode, man kann damit beliebige und beliebig viele Argumente in einen String stopfen, kann zusätzlichen Text dazwischen-fügen, kann zu jedem Argument zT. unerhört differenzierte Zusatz-Angaben machen, wie es im Einzelnen zu formatieren ist.
Beispiel:
Ausgabe:
Das schwierige an
Aber dann wird es etwas verwirrend, auch weil die Syntax so flexibel ist. Und weil manche Zeichen, nämlich
Also das Innere der Platzhalter
Also einfach die drei Abschnitte merken:
1) Argument-Index
2) nach
3) nach
Hier noch MSDN-Doku - zunächst String.Format, dann die Typ-Spezifischen Syntaxen:
String.Format()-Methode Da steht das hier gesagte auch, halt weitschweifiger, und das Abschnitt-Prinzip ist kaum zu verstehen
Standard-Formate für DateTime - Etwa ein einfaches
Benutzerdefinierte Formate für DateTime - halt wie gezeigt, Zeichen mit speziellen Bedeutungen, aus denen man sich die Darstellung so baukastenmäßig komponieren kann, etwa:
Standard-Formate für Zahlen - Etwa ein einfaches
Benutzerdefinierte Formate für Zahlen - ähnlich wie bei
Standard-Formate für TimeSpan - naja, das Prinzip ist glaub jetzt klar, und gilt auch für
Benutzerdefinierte Formate für TimeSpan - benutzerdefinierte Formate.
Enumerationsformatzeichenfolgen - Auch Enums kann man etwas formatieren, die können namentlich ausgeschrieben sein, als hex oder dezimal
Zu den Spezifika ist noch zu sagen, dass diese Syntaxen auch für die ToString()-Methode dieser Typen gelten.
Also
Zum Abschluss noch ein Beispiel mit Spaltenformatierung:
AusgabeWie man sieht, unterstützt
Eigentlich eine geniale Methode, man kann damit beliebige und beliebig viele Argumente in einen String stopfen, kann zusätzlichen Text dazwischen-fügen, kann zu jedem Argument zT. unerhört differenzierte Zusatz-Angaben machen, wie es im Einzelnen zu formatieren ist.
Beispiel:
VB.NET-Quellcode
- Imports Microsoft.VisualBasic.ControlChars ' <- dieser Import importiert praktische String-Konstanten, wie Lf, CrLf, Tab
- '...
- Dim s = String.Format("Hallo {1}!{0}Es ist jetzt {2:hh:mm} Uhr.{0}Du hast dich um {3} Minuten verspätet!{0}Das kost {3:c}", Lf, TextBox1.Text, Date.Now, 7)
- Console.WriteLine(s)
Das schwierige an
String.Format()
ist das System des Format-Strings richtig zu verstehen. Also dass die {}
Platzhalter der Argumente sind, und auch dass die erste Zahl darin je ein bestimmtes Argument addressiert, ist noch einfach.Aber dann wird es etwas verwirrend, auch weil die Syntax so flexibel ist. Und weil manche Zeichen, nämlich
,
und :
an verschiedenen Positionen verschiedene Bedeutung haben.Also das Innere der Platzhalter
{}
- gliedert sich in 3 Abschnitte, wobei die letzten beiden auch weggelassen werden können:- zuerst kommt die Nummer, die das zu formatierende Argument addressiert. diese ist erforderlich
- Dann kann ein
,
folgen, welches den Abschnitt einleitet, der die Spalten-Breite und -Ausrichtung steuert.
ZB{0,-10}
: Das-
bestimmt Linksbündigkeit, wird es weggelassen, ist die Spalte rechtsbündig. Die Zahl bestimmt die Spaltenbreite. - Dann kann ein
:
folgen, welches den typ-spezifischen Abschnitt einleitet.
ZB{2:hh:mm}
: Dashh:mm
ist eine Formatierung, die nur für DateTime Gültigkeit hat. Und hier haben wir genau das verwirrende, dass der:
verschiedenes bedeutet: Der erste:
leitet den typspezifischen Formatierungs-Abschnitt ein, und der zweite:
hat eine für DateTime spezifische Bedeutung - naja, dort könnte auch jedes andere Trennzeichen stehen, auch sowas:{2:hh U\hr mm}
. Beachte hierbei das\h
- dash
muss nämlich "escaped" werden, damit es nicht als Stunden-Formatzeichen interpretiert wird - aber wie gesagt: das ist typspezifische Syntax fürDateTime
, zB beiDouble
wäre sowas ganz ungültig.
Also einfach die drei Abschnitte merken:
1) Argument-Index
2) nach
,
=> SpaltenDefinition 3) nach
:
=> TypSpezifikaHier noch MSDN-Doku - zunächst String.Format, dann die Typ-Spezifischen Syntaxen:
String.Format()-Methode Da steht das hier gesagte auch, halt weitschweifiger, und das Abschnitt-Prinzip ist kaum zu verstehen
Standard-Formate für DateTime - Etwa ein einfaches
d
gibt bei DateTime
den Datum-Anteil aus (ohne ZeitAngabe) und zwar in Kurz-Schreibweise, und entsprechend der Kultur - derlei Zeichen gibts noch einige weitereBenutzerdefinierte Formate für DateTime - halt wie gezeigt, Zeichen mit speziellen Bedeutungen, aus denen man sich die Darstellung so baukastenmäßig komponieren kann, etwa:
dd-MM-yy - hh:mm:ss
Standard-Formate für Zahlen - Etwa ein einfaches
c
stellt eine Zahl als Währungs-Wert dar, kultur-abhängig und mit Nachkommastellen - derlei Zeichen gibts noch einige weitereBenutzerdefinierte Formate für Zahlen - ähnlich wie bei
DateTime
, nur halt für Zahlen, zB #.000
wäre ein baukastenmäßig komponiertes, also benutzerdefiniertes FormatStandard-Formate für TimeSpan - naja, das Prinzip ist glaub jetzt klar, und gilt auch für
TimeSpan
: Es gibt vorgefertigte Standard-Formate, und...Benutzerdefinierte Formate für TimeSpan - benutzerdefinierte Formate.
Enumerationsformatzeichenfolgen - Auch Enums kann man etwas formatieren, die können namentlich ausgeschrieben sein, als hex oder dezimal
Zu den Spezifika ist noch zu sagen, dass diese Syntaxen auch für die ToString()-Methode dieser Typen gelten.
Also
Date.Now.ToString("hh:mm:ss")
folgt derselben DateTime-Formatierungs-Syntax, wie String.Format("{0,20:hh:mm:ss}", Date.Now))
- aber nur der Abschnitt nach dem ersten :
: hh:mm:ss
Zum Abschluss noch ein Beispiel mit Spaltenformatierung:
Console.WriteLine()
String-Formatierung ebenfalls (und's gibt noch paar weitere derartig writende Klassen, wie StreamWriter
, halt alles was von TextWriter
erbt)Dieser Beitrag wurde bereits 17 mal editiert, zuletzt von „ErfinderDesRades“ ()