2011-07-31 16 views
89
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 formateo o hay una versión abreviada que le permite especificar el argumento una vez para ser aplicado a todos los tokens %s?¿Qué tal si tienes el mismo parámetro varias veces en String.format?

Respuesta

189

De the docs:

  • Los especificadores de formato para cultura, el carácter y tipos numéricos tienen la siguiente sintaxis:

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

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

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

Otra opción es utilizar la indexación relativa : El especificador de formato hace referencia el mismo argumento que el último especificador de formato.

Por ejemplo:

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

resultados en hello hello hello hello.

+0

https://docs.oracle.com/javase/8/docs/api/java/util/Formatter.html#dpos – Vadzim

0

Un caso común para reutilizar un argumento en String.format es con un separador (por ejemplo, ";" para CSV o pestaña para la 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.

Es necesario utilizar el separador de primera (con %s) y sólo utilizar el índice argumento (%2$s) para los siguientes sucesos: se añaden

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

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

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