Gunakan kembali parameter dalam String.format?

140
String hello = "Hello";

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

hello hello hello hello hello hello 

Apakah variabel hello perlu diulang beberapa kali dalam panggilan ke metode format atau ada versi singkatan yang memungkinkan Anda menentukan argumen satu kali untuk diterapkan ke semua %stoken?

Carey
sumber

Jawaban:

268

Dari dokumen :

  • Penentu format untuk tipe umum, karakter, dan numerik memiliki sintaks berikut:

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

    Opsional argument_index adalah desimal integer yang menunjukkan posisi argumen dalam daftar argumen. Argumen pertama direferensikan oleh "1$", yang kedua oleh "2$", dll.

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

Opsi lainnya adalah menggunakan pengindeksan relatif : Penentu format mereferensikan argumen yang sama dengan penentu format terakhir.

Sebagai contoh:

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

menghasilkan hello hello hello hello.

Daniel
sumber
15

Anda perlu argumen indeks pengguna %[argument_index$]sebagai berikut:

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

Hasil: hello hello hello hello hello hello

Ahmad Al-Kurdi
sumber
4

Satu kasus umum untuk menggunakan kembali argumen di String.formatadalah dengan pemisah (misalnya ";"untuk CSV atau tab untuk konsol).

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

Ini bukan hasil yang diinginkan. "c"tidak muncul di mana pun.

Anda perlu menggunakan pemisah terlebih dahulu (dengan %s) dan hanya menggunakan indeks argumen ( %2$s) untuk kejadian berikut ini:

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

Spasi ditambahkan agar terbaca dan debugging. Setelah formatnya benar, spasi dapat dihapus di editor teks:

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