Entendiendo el $ en cadenas de formato de Java

84
 StringBuilder sb = new StringBuilder();
 // Send all output to the Appendable object sb
 Formatter formatter = new Formatter(sb, Locale.US);

 // Explicit argument indices may be used to re-order output.
 formatter.format("%4$2s %3$2s %2$2s %1$2s", "a", "b", "c", "d")
 // -> " d  c  b  a"

En este caso, ¿por qué se agrega un 2 a $?

andandand
fuente

Respuestas:

132

No 2tiene nada que ver con $:

  • %     = Inicio de cadena de formato
  • 4$   = Cuarto argumento ('d')
  • 2     = ancho de dos (alineado a la derecha)
  • s     = tipo de cadena
Sven Lilienthal
fuente
Esa explicación realmente nítida gracias. Sin embargo, cuando uso% 4 $ 2s y el valor de mi argumento es 'ABCDEFGH', no recupera solo 2 caracteres. Recuperó la cadena completa. ¿Por qué?
Kandarp
49

Los 2$medios ponen aquí el segundo argumento de la lista. El $ sigue un número que no lo precede. De manera similar, 4$significa poner el cuarto argumento aquí.

Para aclarar, podemos desglosar el %2$2sformato en sus partes:

  • % - indica que se trata de una cadena de formato

  • 2$ - muestra que el segundo argumento de valor debe colocarse aquí

  • 2 - el formato tiene dos caracteres

  • s - formatee el valor como una cadena

Puede encontrar más información en la documentación .

Dave Webb
fuente
En realidad, se votó en contra, cuando fue una respuesta incorrecta. Como es correcto ahora, se eliminó el voto negativo.
Sven Lilienthal
1
@Sven - La respuesta nunca cambió, creo que debes haberla leído mal. Agregué pero no modifiqué ningún contenido.
Dave Webb
Bueno, cuando voté en contra, decía: "Los 2 $ significa poner aquí el segundo argumento de la lista". Eso no es lo que yo consideraría una respuesta correcta.
Sven Lilienthal
Todavía dice exactamente eso ahora y usted ha dicho que ahora es correcto.
Dave Webb
En sí mismo, está mal o al menos no responde a la pregunta, pero puesto en contexto, es correcto.
Sven Lilienthal
4

Esos son argumentos posicionales donde las %4$2sseñales para formatear el cuarto argumento como una cadena con ancho 2. Esto es especialmente útil cuando se proporcionan cadenas para la localización donde los argumentos deben reordenarse sin tocar el código fuente.

Los especificadores de formato para los tipos que se utilizan para representar fechas y horas tienen la siguiente sintaxis:

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

El opcional argument_indexes 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. - Documentación del formateador

Joey
fuente
Aún así, me gustan más las cadenas de formato de .NET ya que hacen que la posición de los argumentos sea mucho más clara.
Joey
4

%: cadena de formato

4$: argumento del cuarto valor

2: ancho (largo cuando se imprime el argumento)

s: es una conversión de argumento de cadena

por ejemplo, el siguiente fragmento:

StringBuffer sb=new StringBuffer();

Formatter formatter=new Formatter(sb,Locale.UK);

formatter.format("-%4$5s-%3$5s-%2$5s-%1$5s-", "a", "b", "c", "d");

System.out.println(sb);

produce una salida de:

-    d-    c-    b-    a-

(ancho de 5 caracteres por argumento, relleno con espacios)

y reemplazando 5con 2, producirá el siguiente resultado:

- d- c- b- a-

¿Ver la diferencia? :)

Rahul Mishra
fuente