Reutilizar un parámetro en 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 

¿La variable hello necesita repetirse varias veces en la llamada al método de formato o hay una versión abreviada que le permite especificar el argumento una vez que se aplicará a todos los %stokens?

Carey
fuente

Respuestas:

261

De los documentos :

  • Los especificadores de formato para los tipos generales, de caracteres y numéricos tienen la siguiente sintaxis:

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

    El argumento_index opcional es un entero decimal que indica la posición del argumento en la lista de argumentos. El primer argumento está referenciado por "1$", el segundo por "2$", etc.

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

Debe indexar el argumento del usuario de %[argument_index$]la siguiente manera:

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
fuente
4

Un caso común para reutilizar un argumento en String.formates con un separador (por ejemplo, ";"para CSV o pestaña para consola).

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

Esta no es la salida deseada. "c"no aparece en ningún lado

Primero debe usar el separador (con %s) y solo usar el índice de argumento ( %2$s) para las siguientes ocurrencias:

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

Se agregan espacios para facilitar la lectura y la depuración. Una vez que el formato parece ser correcto, se pueden eliminar espacios en el editor de texto:

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