Повторно использовать параметр в String.format? - PullRequest
118 голосов
/ 31 июля 2011
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?

Ответы [ 4 ]

229 голосов
/ 31 июля 2011

С документы :

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

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

    Необязательный аргумент_индекса - это десятичное целое число, обозначающее позицию аргумента в списке аргументов. На первый аргумент ссылается "1$", на второй - "2$" и т. Д.

String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);
45 голосов
/ 14 декабря 2016

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

Например:

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

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

9 голосов
/ 10 июля 2018

Вам нужно указать индекс пользователя %[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 голосов
/ 14 июня 2017

Один из распространенных случаев повторного использования аргумента в 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"
...