Використовувати параметр у 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 

Чи потрібно змінну привіт повторювати кілька разів під час виклику методу форматування чи є скорочена версія, яка дозволяє вам один раз вказати аргумент, який буде застосований до всіх %sжетонів?

Відповіді:


261

З документів :

  • Специфікатори формату для загальних, символьних та числових типів мають такий синтаксис:

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

    Необов’язковий argument_index - це десяткове ціле число, що вказує позицію аргументу у списку аргументів. Перший аргумент посилається на "1$", другий - "2$"і т.д.

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

64

Інший варіант полягає у використанні відносної індексації : специфікатор формату посилається на той же аргумент, що і останній специфікатор формату.

Наприклад:

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

результати в hello hello hello hello.



12

Аргумент індексу користувача потрібно вказати %[argument_index$]таким чином:

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

Результат: hello hello hello hello hello hello


4

Один поширений випадок повторного використання аргументу в String.format- з роздільником (наприклад, ";"для CSV або вкладки для консолі).

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

Це не бажаний вихід. "c"ніде не з’являється

Потрібно спочатку використовувати роздільник (з %s) і використовувати лише індекс аргументу ( %2$s) для таких випадків:

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

Пробіли додаються для читабельності та налагодження. Як тільки формат видається правильним, пробіли можна видалити в текстовому редакторі:

System.out.println(String.format("%s%s%s%2$s%s%n", "a", ";", "b", "c"));
// "a;b;c"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.