1. Überblick
2. So verwenden Sie den Formatter
Denken Sie daran, dass Cs printf? Die Formatierung eines String in Java sehr ähnlich ist
String greetings = String.format(
"Hello Folks, welcome to %s !",
"Baeldung");
Der resultierende String ist:
"Hello Folks, welcome to Baeldung !"
Eine Vorlage ist ein String , der statischen Text und einen oder mehrere Formatbezeichner enthält, die angeben, welches Argument an der jeweiligen Position platziert werden soll.
In diesem Fall gibt es einen einzigen Formatbezeichner % s , der durch das entsprechende Argument ersetzt wird.
3. Formatbezeichner
3.1. Allgemeine Syntax
%[argument__index$][flags][width][.precision]conversion
**
**
**
**
**
Wenn Sie in unserem obigen Beispiel die Nummer eines Arguments explizit angeben möchten, können Sie es mit 1 $ und 2 $ Argumentindizes schreiben.
Beide sind das erste bzw. zweite Argument:
String greetings = String.format(
"Hello %2$s, welcome to %1$s !",
"Baeldung",
"Folks");
3.2. Für Date/Time -Darstellung
%[argument__index$][flags][width]conversion
@Test
public void whenFormatSpecifierForCalendar__thenGotExpected() {
Calendar c = new GregorianCalendar(2017, 11, 10);
String s = String.format(
"The date is: %tm %1$te,%1$tY", c);
assertEquals("The date is: 12 10,2017", s);
}
Es ist also in Ordnung, wenn wir argument index__ nicht für das erste angeben, aber wir müssen es für die anderen beiden angeben.
3.3. Formatbezeichner ohne Argumente
%[flags][width]conversion
@Test
public void whenNoArguments__thenExpected() {
String s = String.format("John scored 90%% in Fall semester");
assertEquals("John scored 90% in Fall semester", s);
}
Wenn Sie in format () "%" drucken möchten, müssen Sie es mit "%%" entgehen.
4. Konvertierungen
. . 'H' oder 'H' - für HashCode . 'S' oder 'S' - für String , wenn null , wird "null" ausgegeben, sonst arg.toString () [Quelle, Java, Rinne:, wahr]----
@Test public void givenString whenGeneralConversion thenConvertedString () {String s = String.format ("Die richtige Antwort ist% s", false); assertEquals ("Die richtige Antwort ist falsch", s);
s = String.format ("Die richtige Antwort ist% b", null); assertEquals ("Die richtige Antwort ist falsch", s);
s = String.format ("Die richtige Antwort ist% B", true); assertEquals ("Die richtige Antwort ist WAHR", s); }
Diese Konvertierung kann auch für die Typen int und Integer verwendet werden, wenn Character.isValidCodePoint (int) true für sie zurückgibt.
-
Sie kann je nach dem gewünschten Fall als c oder C geschrieben werden.
Versuchen wir einige Zeichen auszudrucken:
@Test
public void givenString__whenCharConversion__thenConvertedString() {
String s = String.format("The correct answer is %c", 'a');
assertEquals("The correct answer is a", s);
s = String.format("The correct answer is %c", null);
assertEquals("The correct answer is null", s);
s = String.format("The correct answer is %C", 'b');
assertEquals("The correct answer is B", s);
s = String.format("The valid unicode character: %c", 0x0400);
assertTrue(Character.isValidCodePoint(0x0400));
assertEquals("The valid unicode character: Ѐ", s);
}
Nehmen wir noch ein Beispiel für einen ungültigen Codepunkt:
@Test(expected = IllegalFormatCodePointException.class)
public void whenIllegalCodePointForConversion__thenError() {
String s = String.format("The valid unicode character: %c", 0x11FFFF);
assertFalse(Character.isValidCodePoint(0x11FFFF));
assertEquals("The valid unicode character: Ā", s);
}
4.3. Numerisch -
In dieser Kategorie gibt es drei Konvertierungen:
.
-
__O - für Oktalzahl
-
'X' oder 'x' - - für die Hexadezimalzahl
Versuchen wir, jede davon zu drucken:
@Test
public void whenNumericIntegralConversion__thenConvertedString() {
String s = String.format("The number 25 in decimal = %d", 25);
assertEquals("The number 25 in decimal = 25", s);
s = String.format("The number 25 in octal = %o", 25);
assertEquals("The number 25 in octal = 31", s);
s = String.format("The number 25 in hexadecimal = %x", 25);
assertEquals("The number 25 in hexadecimal = 19", s);
}
4.4. Numerisch - Fließkomma
Wird für Java-Gleitkommatypen verwendet: float, Float, double, Double, und BigDecimal
-
'E' oder 'E’ - als Dezimalzahl im Computer formatiert
wissenschaftliche Schreibweise . 'F' - als Dezimalzahl formatiert
-
„G“ oder „G“ - - basierend auf dem Genauigkeitswert nach dem Runden
Konvertierungsformate in computergestützte wissenschaftliche Notation oder Dezimalformat
Versuchen wir, die Fließkommazahlen zu drucken:
@Test
public void whenNumericFloatingConversion__thenConvertedString() {
String s = String.format(
"The computerized scientific format of 10000.00 "
+ "= %e", 10000.00);
assertEquals(
"The computerized scientific format of 10000.00 = 1.000000e+04", s);
String s2 = String.format("The decimal format of 10.019 = %f", 10.019);
assertEquals("The decimal format of 10.019 = 10.019000", s2);
}
-
Date und TemporalAccessor.
Schauen wir uns ein einfaches Beispiel an: [Quelle, Java, Rinne:, wahr]----
@Prüfung public void whenLineSeparatorConversion__thenConvertedString () { String s = String.format ("First Line% nSecond Line"); assertEquals ("Erste Zeile \ n" "Zweite Zeile", s); }
=== ** 5. Flaggen** [Quelle, Java, Rinne:, wahr]---- @Test public void whenSpecifyFlag__thenGotFormattedString () {String s = String.format ("Ohne linksbündiges Flag:% 5d", 25); assertEquals ("Ohne linksbündige Flagge: 25", s); s = String.format ("Mit linksbündiger Markierung:% -5d", 25); assertEquals ("Mit linksbündiger Flagge: 25", s); }
=== 6. Präzision
Die erste Anweisung ist ein Beispiel für die Genauigkeit mit Fließkommazahl Zahlen und die zweite mit allgemeinen Umrechnungen: [Quelle, Java, Rinne:, wahr]----
@Test public void whenSpecifyPrecision__thenGotExpected () {String s = String.format ("Ausgabe von 25.09878 mit Genauigkeit 2:% .2f", 25.09878); assertEquals ("Ausgabe von 25.09878 mit Genauigkeit 2: 25.10", s);
String s2 = String.format ( "Ausgabe des allgemeinen Konvertierungstyps mit Genauigkeit 2:% .2b", true); assertEquals ("Ausgabe des allgemeinen Konvertierungstyps mit Genauigkeit 2: tr", s2); }
=== ** 7. Argumentindex ** [Quelle, Java, Rinne:, wahr]---- @Test public void whenSpecifyArgumentIndex__thenGotExpected () {Kalender c = Calendar.getInstance (); String s = String.format ("Das Datum ist:% tm% 1 $ te,% 1 $ tY", c); assertEquals ("Das Datum ist: 12 10,2017", s); s = String.format ("Das Datum ist:% tm% <te,% <tY", c); assertEquals ("Das Datum ist: 12 10,2017", s); }
Bis jetzt haben wir gesehen, wie die format () -Methode der Formatter -Klasse verwendet wird. Wir können auch eine Formatter -Instanz erstellen und diese verwenden, um die format () Methode.
-
Wir können eine Instanz erstellen, indem Sie ein Appendable übergeben, OutputStream , Datei oder Dateiname ** . Darauf basierend wurde das formatiert String wird in einem Appendable , OutputStream , File gespeichert beziehungsweise.
Sehen wir uns ein Beispiel für die Verwendung mit einem Appendable an. Wir können es verwenden mit anderen auf die gleiche Weise.
==== 8.1. Formatter mit Appendable verwenden
Erstellen Sie eine S _tringBuilder -Instanz sb und erstellen Sie einen Formatter . es benutzen. Dann rufen wir format () auf, um einen String_ zu formatieren: [Quelle, Java, Rinne:, wahr]----
@Prüfung public void whenCreateFormatter__thenFormatterWithAppendable () { StringBuilder sb = new StringBuilder (); Formatierer Formatierer = neuer Formatierer (sb); formatter.format ("Ich schreibe in eine% s-Instanz.", sb.getClass ()); assertEquals ( "Ich schreibe an eine Klasse java.lang.StringBuilder-Instanz.", sb.toString ()); }
=== ** 9. Fazit** In diesem Artikel haben wir die Formatierungsmöglichkeiten von gesehen __java.util.Formatter__-Klasse. Wir haben verschiedene Syntax gesehen, die verwendet werden kann Formatieren Sie den __String__ und die Konvertierungstypen, für die verwendet werden kann verschiedene Datentypen. Wie üblich ist der Code für die Beispiele, die wir gesehen haben, zu finden https://github.com/eugenp/tutorials/tree/master/core-java auf über Github].