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"