Ponownie użyć parametru w String.format?

136
String hello = "Hello";

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

hello hello hello hello hello hello 

Czy zmienna hello musi być powtarzana wiele razy w wywołaniu metody format, czy też istnieje skrócona wersja, która pozwala raz określić argument, który ma zostać zastosowany do wszystkich %stokenów?

Carey
źródło

Odpowiedzi:

261

Z dokumentów :

  • Specyfikatory formatu dla typów ogólnych, znakowych i liczbowych mają następującą składnię:

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

    Opcjonalny argument_index to dziesiętna liczba całkowita wskazująca pozycję argumentu na liście argumentów. Do pierwszego argumentu odwołuje się "1$", do drugiego "2$"itd.

String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);
Ignacio Vazquez-Abrams
źródło
64

Inną opcją jest użycie indeksowania względnego : specyfikator formatu odwołuje się do tego samego argumentu, co ostatni specyfikator formatu.

Na przykład:

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

powoduje hello hello hello hello.

Daniel
źródło
12

Musisz użyć argumentu indeksu użytkownika %[argument_index$]w następujący sposób:

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

Wynik: hello hello hello hello hello hello

Ahmad Al-Kurdi
źródło
4

Jednym z typowych przypadków ponownego użycia argumentu w programie String.formatjest użycie separatora (np. ";"Dla CSV lub tabulatora dla konsoli).

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

To nie jest pożądane wyjście. "c"nie pojawia się nigdzie.

Musisz najpierw użyć separatora (z %s) i używać argumentu index ( %2$s) tylko w następujących przypadkach:

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

Spacje są dodawane w celu zwiększenia czytelności i debugowania. Gdy format wydaje się być poprawny, spacje można usunąć w edytorze tekstu:

System.out.println(String.format("%s%s%s%2$s%s%n", "a", ";", "b", "c"));
// "a;b;c"
Eric Duminil
źródło