Leitfaden für java.util.Formatter

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:

.

  1. __O - für Oktalzahl

  2. '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

  1. 'E' oder 'E’ - als Dezimalzahl im Computer formatiert

wissenschaftliche Schreibweise . 'F' - als Dezimalzahl formatiert

  1. „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);
}

=== 8. Andere Verwendungsmöglichkeiten von Formatter

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].