Parameter in String.format wiederverwenden?

136
String hello = "Hello";

String.format("%s %s %s %s %s %s", hello, hello, hello, hello, hello, hello);

hello hello hello hello hello hello 

Muss die Hallo-Variable beim Aufruf der Formatierungsmethode mehrmals wiederholt werden, oder gibt es eine Kurzversion, mit der Sie das Argument angeben können, das einmal auf alle %sToken angewendet werden soll ?

Carey
quelle

Antworten:

261

Aus den Dokumenten :

  • Die Formatbezeichner für allgemeine, Zeichen- und numerische Typen haben die folgende Syntax:

        %[argument_index$][flags][width][.precision]conversion

    Der optionale Argumentindex ist eine Dezimalzahl, die die Position des Arguments in der Argumentliste angibt. Das erste Argument wird von "1$", das zweite von "2$"usw. referenziert .

String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);
Ignacio Vazquez-Abrams
quelle
64

Eine andere Option ist die relative Indizierung : Der Formatbezeichner verweist auf dasselbe Argument wie der letzte Formatbezeichner.

Beispielsweise:

String.format("%s %<s %<s %<s", "hello")

führt zu hello hello hello hello.

Daniel
quelle
12

Sie müssen das Argument %[argument_index$]des Benutzerindex wie folgt verwenden:

String hello = "Hello";
String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);

Ergebnis: hello hello hello hello hello hello

Ahmad Al-Kurdi
quelle
4

Ein häufiger Fall für die Wiederverwendung eines Arguments in String.formatist ein Trennzeichen (z. B. ";"für CSV oder Tab für Konsole).

System.out.println(String.format("%s %2$s %s %2$s %s %n", "a", ";", "b", "c"));
// "a ; ; ; b"

Dies ist nicht die gewünschte Ausgabe. "c"erscheint nirgendwo.

Sie müssen zuerst das Trennzeichen (mit %s) und nur das Argument index ( %2$s) für die folgenden Vorkommen verwenden:

System.out.println(String.format("%s %s %s %2$s %s %n", "a", ";", "b", "c"));
//  "a ; b ; c"

Leerzeichen werden zur besseren Lesbarkeit und zum Debuggen hinzugefügt. Sobald das Format korrekt zu sein scheint, können Leerzeichen im Texteditor entfernt werden:

System.out.println(String.format("%s%s%s%2$s%s%n", "a", ";", "b", "c"));
// "a;b;c"
Eric Duminil
quelle