Conversión de entero a cadena con coma por miles

182

Quiero convertir un número entero 35634646 para que tenga el millar "," por lo que debería ser 35,634,646.

¿Cuál sería la forma más rápida de hacerlo?

Dominik
fuente

Respuestas:

293
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(35634646));
Output: 35,634,646
Eng.Fouad
fuente
55
Tuve que agregar import java.text.NumberFormat;.
Mike S
66
Esto obliga a la agrupación de estilo estadounidense que siempre usa ,, sin embargo, también hay regiones que usan .para la agrupación. En una palabra, codificar un entorno local se considera una mala práctica.
Hai Zhang
44
@DreaminginCode Para hacerlo bien Locale.getCurrent()es la solución
Roger RV
@RogerRV No hay Locale.getCurrent () (al menos en Android)
E.Akio
Sí, esta no es la mejor respuesta para el 96% de las personas que no viven en los EE
fig
152

¿Pide el más rápido, pero quizás quiere decir "mejor" o "correcto" o "típico"?

También solicita comas para indicar miles, pero ¿tal vez quiere decir "en forma normal legible por humanos de acuerdo con la costumbre local de su usuario"?

Lo haces así:

    int i = 35634646;
    String s = NumberFormat.getIntegerInstance().format(i);

Los estadounidenses obtendrán "35,634,646"

Los alemanes obtendrán "35.634.646"

Los alemanes suizos obtendrán "35'634'646"

Steve McLeod
fuente
¿Dónde puedo obtener el patrón numérico de cada localidad? Traté de leer el código pero no lo encuentro en ninguna parte
nhoxbypass
41

Enteros:

int value = 100000; 
String.format("%,d", value); // outputs 100,000

Dobles:

double value = 21403.3144d;
String.format("%,.2f", value); // outputs 21,403.31

String.format es bastante poderoso.

- Editado por retroalimentación psuzzi .

Frankie
fuente
1
Ventaja: No "nuevo", no carga el recolector de basura (a diferencia de DecimalFormat).
Contango
Echa un vistazo String.format. Comienza con return new Formatter(l) ...etc. Así que el argumento del recolector de basura no es tan fuerte como parece.
Scheintod
2
Esta es mi respuesta favorita, la pregunta pide trabajar con Integer, así que aquí está el código: int value = 100000; String.format ("%, d", valor);
psuzzi
20
 int value = 35634646;
 DecimalFormat myFormatter = new DecimalFormat("#,###");
 String output = myFormatter.format(value);
 System.out.println(output);

Salida: 35,634,646

Bala R
fuente
1
Su patrón no necesita ser más que #,###, si desea un formato de estilo europeo, puede usarlo #,##,###.
Ali
77
@ Ali: El formato que describe solo se usa en India, y estoy al menos 90% seguro de que India no está en Europa.
Cairnarvon
Lo entiendo ... bien, si necesitas formato indio, así es como lo haces.
Ali
1
Esto depende de la configuración regional y no producirá la salida correcta (según la pregunta) si se ejecuta donde la configuración regional predeterminada no separa miles con a ,.
antak
17

Las otras respuestas son correctas, sin embargo, verifique su ubicación antes de usar "%,d":

Locale.setDefault(Locale.US);
int bigNumber = 35634646;
String formattedNumber = String.format("%,d", bigNumber);
System.out.println(formattedNumber);

Locale.setDefault(new Locale("pl", "PL"));
formattedNumber = String.format("%,d", bigNumber);
System.out.println(formattedNumber);

Resultado:

35,634,646
35 634 646
Grzegorz Szpetkowski
fuente
3

Esta solución funcionó para mí:

NumberFormat.getNumberInstance(Locale.US).format(Integer.valueOf("String Your Number"));
COMO
fuente
3

Use el %despecificador de formato con una coma:%,d

Esta es, con mucho, la forma más fácil.

Annie Johnson
fuente
1

Si se debe hacer lo mismo en el JSP, use:

<fmt:formatNumber pattern="#,##0" value="${yourlist.yourintvalue}" var="formattedVariable" />
<c:out value="${formattedVariable}"></c:out>

por supuesto para el uso de valores múltiples:

<c:forEach items="${yourlist}" var="yourlist">

    <fmt:formatNumber pattern="#,##0" value="${yourlist.yourintvalue}" var="formattedVariable" />
    <c:out value="${formattedVariable}"></c:out>
</c:forEach>
Navankur Chauhan
fuente
1

Aquí hay una solución para aquellos de ustedes que no pueden acceder a "numberformat" ni a "String.format" (usando una versión limitada de java dentro de un framework). Espero que sea útil.

number= 123456789;
thousandsSeparator=",";
myNumberString=number.toString();   
numberLength=myNumberString.length;
howManySeparators=Math.floor((numberLength-1)/3)
formattedString=myNumberString.substring(0,numberLength-(howManySeparators*3))
while (howManySeparators>0)    {
formattedString=formattedString+thousandsSeparator+myNumberString.substring(numberLength-(howManySeparators*3),numberLength-((howManySeparators-1)*3));
howManySeparators=howManySeparators-1;    }

formattedString
usuario1807050
fuente
Considere editar su respuesta agregando algunos comentarios a su código (y quizás envolverlo en un método, para que pueda ser más útil)
noiaverbale
0

usar extensión

import java.text.NumberFormat

val Int.commaString: String
  get() = NumberFormat.getInstance().format(this)

val String.commaString: String
  get() = NumberFormat.getNumberInstance().format(this.toDouble())

val Long.commaString: String
  get() = NumberFormat.getInstance().format(this)

val Double.commaString: String
  get() = NumberFormat.getInstance().format(this)

resultado

1234.commaString => 1,234
"1234.456".commaString => 1,234.456
1234567890123456789.commaString => 1,234,567,890,123,456,789
1234.456.commaString => 1,234.456
Changhoon
fuente
-1

no puedes usar un

System.out.printf("%n%,d",int name);

La coma en el printfdebería agregar las comas en el %dinter.

No es positivo al respecto, pero funciona para mí.

Josh
fuente
eso no está compilando para mí
Mishax
"No es positivo al respecto". Inútil.
Rob Shepherd
-8

Primero debe incluir las etiquetas JSTL: -

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> 

al comienzo de la página

Ankur
fuente