stackoverflow java string formatting

stackoverflow - Sprintf equivalente en Java



string.format android (3)

@erickson.

Las cuerdas son tipos inmutables. No puedes modificarlos, solo devuelve nuevas instancias de cadena.

Debido a eso, "foo" .format () tiene poco sentido, ya que tendría que llamarse como

string newString = "foo".format();

Los autores de Java originales (y los autores de .NET) decidieron que un método estático tenía más sentido en esta situación, ya que no está modificando "foo", sino que llama a un método de formato y pasa una cadena de entrada.

EDIT : Je, este sitio puede ser tan divertido a veces. Me votaron por mencionar el hecho de que las cadenas son tipos inmutables.

Aquí hay un ejemplo de por qué Format () sería un método de instancia tonto. En .NET (y probablemente en Java), Replace () es un método de instancia.

Puedes hacerlo:

"I Like Wine".Replace("Wine","Beer");

Sin embargo, no pasa nada, porque las cuerdas son inmutables. Reemplazar intenta devolver una cadena nueva, pero se asigna a nada.

Esto causa muchos errores comunes de novatos como:

// Contrived Example inputText.Replace(" ","%20");

Una vez más, no pasa nada, en su lugar tienes que hacer:

inputText = inputText.Replace(" ","%20");

Ahora, si entiendes que las cuerdas son inmutables, eso tiene perfecto sentido. Si no lo haces, entonces estás confundido. El lugar adecuado para Reemplazar, sería donde está el Formato, como un método estático de Cadena:

inputText = String.Replace(inputText," ", "%20");

Ahora no hay duda de qué está pasando.

La verdadera pregunta es, ¿por qué los autores de estos marcos decidieron que uno debería ser un método de instancia y el otro estático? En mi opinión, ambos se expresan de manera más elegante como métodos estáticos, pero erickson parece pensar que ambos pertenecen como métodos de instancia.

Independientemente de su opinión, la verdad es que es menos propenso a cometer un error al usar la versión estática, y el código es más fácil de entender (No hay ocultos Gotchas).

Por supuesto, hay algunos métodos que son perfectos como métodos de instancia, toma String.Length ()

int length = "123".Length();

En esta situación, es obvio que no estamos tratando de modificar "123", simplemente lo inspeccionamos y devolvemos su longitud ... Este es un candidato perfecto para un método de instancia.

Mis reglas simples para los métodos de instancia en objetos inmutables:

  • Si necesita devolver una nueva instancia del mismo tipo, use un método estático.
  • De lo contrario, utilice un método de instancia.

Printf se agregó a Java con la versión 1.5, pero parece que no encuentro cómo enviar la salida a una cadena en lugar de a un archivo (que es lo que hace sprintf en C). ¿Alguien sabe como hacer esto?


Ambas soluciones funcionan para simular printf, pero de una manera diferente. Por ejemplo, para convertir un valor en una cadena hexadecimal, tiene las 2 soluciones siguientes:

  • con el format() , más cercano a sprintf() :

    final static String HexChars = "0123456789abcdef"; public static String getHexQuad(long v) { String ret; if(v > 0xffff) ret = getHexQuad(v >> 16); else ret = ""; ret += String.format("%c%c%c%c", HexChars.charAt((int) ((v >> 12) & 0x0f)), HexChars.charAt((int) ((v >> 8) & 0x0f)), HexChars.charAt((int) ((v >> 4) & 0x0f)), HexChars.charAt((int) ( v & 0x0f))); return ret; }

  • con replace(char oldchar , char newchar) , algo más rápido pero bastante limitado:

    ... ret += "ABCD". replace(''A'', HexChars.charAt((int) ((v >> 12) & 0x0f))). replace(''B'', HexChars.charAt((int) ((v >> 8) & 0x0f))). replace(''C'', HexChars.charAt((int) ((v >> 4) & 0x0f))). replace(''D'', HexChars.charAt((int) ( v & 0x0f))); ...

  • Hay una tercera solución que consiste en simplemente agregar el carácter a ret uno por uno (¡los caracteres son números que se suman entre sí !) Como en:

    ... ret += HexChars.charAt((int) ((v >> 12) & 0x0f))); ret += HexChars.charAt((int) ((v >> 8) & 0x0f))); ...

... pero eso sería muy feo.


// Store the formatted string in ''result'' String result = String.format("%4d", i * j); // Write the result to standard output System.out.println( result );

Ver format y su syntax