Printf consiguió añadido a Java con la versión 1.5, pero me parece que no puede encontrar la forma de enviar la salida a una cadena en lugar de un archivo (que es lo que hace sprintf en C). ¿Alguien sabe como hacer esto?sprintf equivalente en Java
Respuesta
.
Las cadenas son inmutables tipos. No puede modificarlos, solo devuelve nuevas instancias de cadena.
Debido a eso, "foo" .formato() no tiene mucho sentido, ya que tendría que ser llamado como
string newString = "foo".format();
Los autores originales (Java y .NET autores), decidió que un método estático tiene 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: Heh, este sitio puede ser tan divertido a veces. Me criticaron por mencionar el hecho de que las cadenas son tipos inmutables.
Aquí es un ejemplo de por qué Format() sería tonto como un método de instancia. En .NET (y probablemente en Java), Replace() es un método de instancia.
Usted puede hacer esto:
"I Like Wine".Replace("Wine","Beer");
Sin embargo, no pasa nada, porque las cadenas son inmutables. Reemplazar intenta devolver una nueva cadena, pero está asignada a nada.
Esto provoca una gran cantidad de errores de novato comunes como:
// Contrived Example
inputText.Replace(" ","%20");
Una vez más, no pasa nada, en lugar que tiene que hacer:
inputText = inputText.Replace(" ","%20");
Ahora, si se entiende que las cadenas son inmutables, que hace que sentido perfecto. Si no lo haces, entonces estás confundido. El lugar apropiado para reemplazar, estaría donde Formato es, como un método estático de la secuencia:
inputText = String.Replace(inputText," ", "%20");
Ahora no hay duda en cuanto a qué se está encendiendo.
La verdadera pregunta es, ¿por qué los autores de estos marcos deciden que uno debe ser un método de instancia, y el otro estática? En mi opinión, ambos se expresan con mayor elegancia 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 son menos propensos a cometer un error utilizando la versión estática, y el código es más fácil de entender (n Gotchas Oculta).
Por supuesto, hay algunos métodos que son perfectos como los métodos de instancia, tomar String.length()
int length = "123".Length();
En esta situación, es obvio que no están tratando de modificar "123", que acabamos de inspeccionarlo y devolviendo su longitud ... Este es un candidato perfecto para un método de instancia.
Mis reglas simples para los métodos de instancia sobre inmutables Objetos:
- Si necesita devolver una nueva instancia del mismo tipo, utilizan un método estático.
- De lo contrario, utilice un método de instancia.
Ambas soluciones funcionan para simular printf, pero de una manera diferente. Por ejemplo, para convertir un valor a una cadena hexadecimal, tiene las 2 siguientes soluciones:
con
format()
, más cercano asprintf()
:final static String HexChars = "abcdef"; 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)
, un poco más rápido, pero bastante limitadas :... 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 solo anuncios ding el char a
ret
uno por uno (char son números que suman entre sí!) como por ejemplo en:... ret += HexChars.charAt((int) ((v >> 12) & 0x0f))); ret += HexChars.charAt((int) ((v >> 8) & 0x0f))); ...
... pero eso sería realmente feo.
Todas las ideas excelentes, pero convierte su código en un código de escritura imposible de entender para su compañero de trabajo. – Ben
- 1. equivalente de Sprintf en Mathematica?
- 2. ¿Hay un equivalente MySQL de sprintf?
- 3. ¿Hay un sprintf equivalente para node.js
- 4. ¿Algún método similar al sprintf en Java?
- 5. SPRINTF en shell scripting?
- 6. sprintf en C#?
- 7. sprintf en Delphi?
- 8. xml.etree.ElementTree equivalente en Java
- 9. __LINE__ equivalente en Java?
- 10. DebugBreak equivalente en Java?
- 11. Clojure sprintf?
- 12. 'sprintf': doble precisión en C
- 13. Ruby sprintf actuando en 1.9
- 14. sprintf like funcionalidad en Python
- 15. equivalente de memcmp() en Java?
- 16. Java System.currentTimeMillis() equivalente en C#
- 17. C# DateTime.Ticks equivalente en Java
- 18. de Java() equivalente en pitón
- 19. NServiceBus equivalente en Java world
- 20. equivalente de DataTable en Java
- 21. Java TreeMap equivalente en C#?
- 22. ¿Hay equivalente epoll en Java?
- 23. Bloques ObjectiveC equivalente en Java
- 24. Python "Evento" equivalente en Java?
- 25. equivalente de ungetc En java
- 26. Java Map equivalente en C#
- 27. ¿Equivalente a #define en Java?
- 28. Java Mahout equivalente en Python
- 29. ¿Qué significa sprintf?
- 30. php formato sprintf cadena
Veo que de alguna manera tiene la idea de que estaba sugiriendo que se modifique la cadena de formato. Nunca consideré la posibilidad de que alguien espere que una Cadena cambie, ya que su inmutabilidad es tan fundamental. – erickson
Al ver que la cadena de formato es más parecida a "El precio es% 4d", y no "% 4d", todavía veo un gran potencial de confusión. ¿Qué tienes contra los métodos estáticos? :) – FlySwat
Esta respuesta parece no tener nada que ver con la pregunta. –