Повторно использовать параметр в 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 

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

Ответы:


261

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

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

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

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

String.format("%1$s %1$s %1$s %1$s %1$s %1$s", 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) и использовать только аргумент index ( %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.