Повторно использовать параметр в String.format?

String hello = "Hello";

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

hello hello hello hello hello hello 

Нужно ли многократно повторять переменную hello в вызове метода format или есть сокращенная версия, которая позволяет указать аргумент один раз для всех токенов %s?

Ответ 1

Из документов:

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

        %[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);

Ответ 2

Другой вариант - использовать относительную индексацию: спецификатор формата ссылается на тот же аргумент, что и последний спецификатор формата.

Например:

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

приводит к hello hello hello hello.

Ответ 3

Вам необходимо использовать индексный аргумент %[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"