¿Tengo que especificar una variable para cada argumento idéntico en String.format?

2 minutos de lectura

Avatar de usuario de Carey
Carey

String hello = "Hello";

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

hello hello hello hello hello hello 

¿El hello la variable debe repetirse varias veces en la llamada al método de formato o existe una versión abreviada que le permite especificar el argumento una vez para que se aplique a todos los %s fichas?

Avatar de usuario de Ignacio Vázquez-Abrams
Ignacio Vázquez-Abrams

De los documentos:

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

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

el opcional argumento_índice es un 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);

Avatar de usuario de Daniel
Daniel

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

Por ejemplo:

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

da como resultado hello hello hello hello.

Avatar de usuario de Ahmad Al-Kurdi
Ahmad Al-Kurdi

Necesitas usar el argumento index %[argument_index$] como el seguiente:

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

Un caso común para reutilizar un argumento en String.format es con un separador (ej. ";" 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 por ningún lado.

Primero debe usar el separador (con %s) y solo use 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 mejorar la legibilidad y la depuración. Una vez que el formato parezca correcto, se pueden eliminar los espacios en el editor de texto:

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

¿Ha sido útil esta solución?