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?

Respuestas:


293
System.out.println(NumberFormat.getNumberInstance(Locale.US).format(35634646));
Output: 35,634,646

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"


¿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 .


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


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

3

Esta solución funcionó para mí:

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

3

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

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


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>

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

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

-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í.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.