Zeit Framework und Text-Formatierung
Siehe auch Zeit, Weiteres zu Strings
2. Text-Formatierung
in Arbeit ...
Es gibt im JDK mehrere Verfahren, die Produktion von Texten effizienter, übersichtlicher und flexibler zu machen.
Einzelne dafür sind spezialisiert (z.B. zur Darstellung von Zeit-Information), andere sehr einfach zu nutzen.
Einer der Ansätze ist schon sehr alt (geht auf die Sprache C zurück), ist aber vermutlich der flexibelste unter ihnen.
Diesen werden wir uns nun ansehen.
Wichtig zu wissen ist dabei, dass es es mehrere Klassen bzw. Methoden gibt, dieses Konzept zu nutzen
Deklaration für alle:
String txt;
String template = "Format-String %s %d";
-
txt = String.format(template, "Ein Text", -999)
-
`
txt = template.formatted("Ein Text", -999)` -
System.out.printf(template)
Eine Format-Spezifikation (Format-Specifier) hat folgenden Aufbau:
%[argument_index$][flags][width][.precision]conversion
- argument_index$
-
optional zu verwendendes Argument (wenn Positionszuordnung nicht passt) z.B.
1$
(erstes Argument),2$
, … - flags
-
optionales Set von Zeichen, die das produzierte Format beeinflussen. je nach Datenart unterschiedlich.
- width
-
optionale positive Ganzzahl (dezimal), legt minimale Zeichenzahl des Outputs fest. (wichtig z.B. für tabellarische Ausgabe)
- precision
-
optional - Punkt gefolgt von einer nicht-negativen dezimalen Ganzzahl. Bei Nicht-Ganzzahl-Formaten legt es die Anzahl der Nachkommastellen fest, bei anderen die Maximal-Stellenanzahl des Outputs (nicht definiert für Einzelzeichen, Boolean u.ä.)
- conversion
-
notwendiger Buchstabe (bei Zeit auch mehrere) definiert den "Typ" des Arguments (nicht deckungsgleich mit Java-Typ-System!).
Z.B. 'd' für Ganzzahlen (byte, short, int, long), 's' für Strings, 'f' für float und double, 'b' für Boolean, 'c' für char. Bei manchen gibt es auch Uppercase-Varianten, die die Ausgabebuchstaben auf klein/groß festlegen
The required conversion is a character indicating how the argument should be formatted. The set of valid conversions for a given argument depends on the argument’s data type.
public void formattingBasics() {
System.out.println("Textformatierung mit %s (%n erzeugt OS-spezifische Zeilenschaltung):");
System.out.format("Das ist ein Text: \"%s\"%n", "Ich bin der Text");
System.out.format("Das ist ein rechtsbündiger min. 25-Zeichen-Text: \"%25s\"%n",
"Ich bin der Text");
System.out.format("Das ist ein linksbündiger min. 25-Zeichen-Text: \"%-25s\"%n",
"Ich bin der Text");
System.out.format("Das ist ein linksbündiger 4-10-Zeichen-Text: \"%-4.10s\"%n",
"Ich bin der Text");
System.out.format("Das ist ein linksbündiger 4-10-Zeichen-Text: \"%-4.10s\"%n", "Ich");
System.out.println();
System.out.println("Ganzzahl-Formatierung:");
System.out.format(
"Zahl unformatiert: %d %n - und selbe Zahl (1$) mit Min-Länge und fixierter"
+ " Stellen-Anzahl, '+' vor pos. Zahlen: %1$+06d%n "
+ "- und zuletzt (wieder selbe Zahl, diesmal mit <) als HEX-Zahl:%<x%n",
256);
System.out.format("Mit Locale-spezifischem Tausender-Trenner: %,d", 100000000);
System.out.println();
System.out.println("Nicht-ganze Zahlen:");
System.out.format(Locale.US,
"Pi standard-formatiert (US): %2$f, nun mit 18 Nachkommastellen: %2$+13.18f;%n"
+ "Negative Wurzel 2: %1$f, nun mit 3 Nachkommastellen: %<06.3f%n",
-Math.sqrt(2), Math.PI);
System.out.format(Locale.UK, "Tausender-Trenner (UK): %,f%n", 1234567.8901234);
System.out.format(Locale.GERMAN, "Tausender-Trenner (GERMAN): %,f%n", 1234567.8901234);
System.out.format(new Locale("de", "AT"), "Tausender-Trenner (de_AT): %,f%n", 1234567.8901234);
System.out.format("aktuelle LOCALE: %s", Locale.getDefault());
System.out.println();
System.out.println("Boolean, Char:");
}