¿Cómo formateo un entero largo como una cadena sin separador en Java?

122

Pregunta simple, pero apuesto a que preguntar aquí probablemente sea más sencillo que tratar de entender la documentación para MessageFormat:

long foo = 12345;
String s = MessageFormat.format("{0}", foo);

El valor observado es "12,345".

El valor deseado es "12345".

Daniel Fortunov
fuente

Respuestas:

62

Solo usa Long.toString(long foo)

Rob H
fuente
12
OString.valueOf(long)
rsp
66
String.valueOf () llama a Long.toString ()
Peter Lawrey el
77
Tal vez esto sea insignificante, pero en este caso estás confiando en un comportamiento indocumentado de Long.toString (foo). Por esa razón, prefiero la respuesta de Daniel Fortunov.
John K
44
No es indocumentado. Ver download.oracle.com/javase/6/docs/api/java/lang/… .
Rob H
3
OK, sin embargo, esta solución no es aplicable al formato de mensajes en ResourceBundle. Tuto i18n
Guillaume Husta
332
MessageFormat.format("{0,number,#}", foo);
Daniel Fortunov
fuente
1
Gracias, estaba tratando de hacer esto con la inyección de propiedades MessageFormat. ¡Qué bueno que hay más de una forma de hacerlo!
Philihp Busby
3
Prefiero de esta manera. ya que me permite cambiar el formato en el archivo de propiedades de mi idioma.
Pascal
2
¡Solución perfecta! Me ayudó a mantener la opción de formato / sin formato en los datos de referencia en lugar de en el nivel de código, ¡gracias! Y como dijo @SebastianRoth, esta debería haber sido la respuesta aceptada.
Ofer Lando
9
En realidad estoy sorprendido por qué prettying cadenas numéricas un defecto y no es una cosa explícita con la API formateador
humblerookie
1
Esto también funciona dentro de un formato de elección si cita el patrón:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0
1

Luché un poco con esto cuando traté de hacer patrones del "mundo real" con internacionalización, etc. Específicamente, tenemos la necesidad de usar un formato de "elección" donde la salida depende de los valores que se muestran, y para eso java.text.ChoiceFormatestá.

Aquí hay un ejemplo de cómo hacer esto:

    MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");

    int[] nums = new int[] {
            0,
            1,
            100,
            1000,
            10000,
            100000,
            1000000,
            10000000
    };

    Object[] a = new Object[1];
    for(int num : nums) {
        a[0] = num;
        System.out.println(fmt.format(a));
    }

Esto genera el siguiente resultado; Espero que sea útil para otros que están tratando de lograr el mismo tipo de cosas:

zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000

Como puede ver, el formato de "elección" nos permite elegir el tipo de formato que se utilizará en función del valor que se va a pasar a formatear. Los números pequeños se pueden reemplazar con texto (no se muestra el valor original). Los números de tamaño mediano se muestran sin separadores de agrupación (sin comas). Los números más grandes incluyen las comas, nuevamente. Obviamente, este es un ejemplo totalmente artificial para demostrar la flexibilidad de java.text.MessageFormat.

Una nota sobre lo citado #en el formato de texto: dado que ambos ChoiceFormaty MessageFormatse están utilizando, existe una colisión entre metacaracteres entre los dos. ChoiceFormatusos #como un meta que esencialmente significa "igual" para que el motor de formatear sabe que por ejemplo en el caso de 1#one!que estamos comparando {0}con 1, y si son iguales, se utiliza esa "elección" en particular.

Pero #tiene otro significado para MessageFormat, y eso es como un metacarácter que tiene significado para DecimalFormat: es un metacarácter que significa "poner un número aquí".

Debido a que está envuelto en una ChoiceFormatcadena, #es necesario citarlo. Cuando ChoiceFormattermina de analizar la cadena, esas comillas se eliminan al pasar los subformatos a MessageFormat(y luego a DecimalFormat).

Entonces, cuando está usando {0,choice,...}, debe citar esos #caracteres, y posiblemente otros.

Christopher Schultz
fuente
0

El camino más corto es

long foo = 12345;
String s = ""+foo;
Peter Lawrey
fuente
3
Y, como siempre, esto se expande, por new StringBuilder("").append(foo).toString()lo que no es realmente óptimo.
RAnders00
1
@ RAnders00 La conversión de un número en una sola cadena es poco probable que sea la opción más óptima, dependiendo del contexto, generalmente puede evitarlo por completo, pero para el patrón más simple que puede usar""+
Peter Lawrey el
1
Tienes razón, pero solo quería señalarlo ya que la gente siempre tiende a señalarlo.
RAnders00
1
@ RAnders00 por cierto, usar un formato de mensaje es un orden de magnitud más costoso y más complicado en este caso.
Peter Lawrey el
Sí, uno debería usarlo Long.toString()ya que es lo que esta solución usa en segundo plano de todos modos :)
RAnders00
-1

Como alternativa String.formaty java.util.Formatterpodría funcionar para usted también ...

Frank Grimm
fuente
-6

Tu podrías intentar:

String s = new Long(foo).toString();
mportiz08
fuente
8
Creación innecesaria de objetos. Nunca use nuevo con clases de envoltura.
keiki