Reutilizar um parâmetro em 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 

A variável hello precisa ser repetida várias vezes na chamada para o método format ou existe uma versão abreviada que permite especificar o argumento uma vez a ser aplicado a todos os %stokens?

Carey
fonte

Respostas:

261

Dos documentos :

  • Os especificadores de formato para tipos geral, de caractere e numéricos têm a seguinte sintaxe:

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

    O argumento_índice opcional é um número inteiro decimal indicando a posição do argumento na lista de argumentos. O primeiro argumento é referenciado por "1$", o segundo por "2$", etc.

String.format("%1$s %1$s %1$s %1$s %1$s %1$s", hello);
Ignacio Vazquez-Abrams
fonte
64

Outra opção é usar a indexação relativa : O especificador de formato faz referência ao mesmo argumento que o último especificador de formato.

Por exemplo:

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

resulta em hello hello hello hello.

Daniel
fonte
12

Você precisa do argumento do índice do usuário %[argument_index$]da seguinte maneira:

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

Resultado: hello hello hello hello hello hello

Ahmad Al-Kurdi
fonte
4

Um caso comum para reutilizar um argumento em String.format é com um separador (por exemplo, ";"para CSV ou guia para console).

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

Esta não é a saída desejada. "c"não aparece em lugar nenhum.

Você precisa usar o separador primeiro (com %s) e usar apenas o índice de argumentos (%2$s ) para as seguintes ocorrências:

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

Espaços são adicionados para facilitar a leitura e a depuração. Depois que o formato parecer correto, os espaços poderão ser removidos no editor de texto:

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