¿Cómo configurar el separador de miles en Java?


129

¿Cómo configurar el separador de miles en Java?
Tengo una representación de String de un BigDecimal que quiero formatear con un separador de miles y devolver como String.


¿Obtiene estos valores de DB?
Programador muerto el

Respuestas:


110

Esto debería funcionar (no probado, basado en JavaDoc):

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Según JavaDoc, el reparto en la primera línea debe guardarse para la mayoría de las configuraciones regionales.


16
Comentario no probado en esto: Javadoc para getDecimalFormatSymbols()dice: Returns: a copy of the desired DecimalFormatSymbols. Por lo tanto, debe usar setDecimalFormatSymbols(theCopy)después de alterar la copia.
java.is.for.desktop

66
Los documentos para bd.longValue () dicen "cualquier parte fraccionaria será descartada". Así que no sé si esta es la mejor manera de hacerlo si te importa la precisión
codinguser

2
Supongo que podría usarlo newy configurarlo de nuevo en formateador: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong

Creo que querrías usar \ u00a0 (espacio sin interrupción) como separador de agrupación. Es el valor predeterminado para algunas configuraciones regionales.
ACV

3
¿Por qué llamas longValue? La pregunta era establecer miles de operadores para BigDecimal, no por mucho tiempo.
FINDarkside

232

Puede usar la función de formato con ",";

int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

"," incluye caracteres de agrupación específicos de la localidad.

docs


11
¿Qué sucede si quiero usar a .como separador?
Enissay

Como suelo usar String.format, ¡es el mejor y más fácil para mí!
Ali

16
@Enissay Llame format()con una configuración regional explícita ( Local.USse sabe que el uso ,como separador) y luego vuelva a colocar ,con su separador personalizado: String.format(Locale.US, "%,d", n).replace(',', '.').
minipif

java.util.IllegalFormatConversionException:% d no puede formatear los argumentos de java.lang.String
Iman Marashi el

1
@ImanMarashi Transmítelo a un int. O a long. O a BigInteger. Y use f si quiere usar double, floato BigDecimal.
Adowrath

56
BigDecimal bd = new BigDecimal(300000);

NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));

System.out.println(formatter.format(bd.longValue()));

EDITAR

Para obtener un separador de agrupación personalizado como el espacio, haga esto:

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setGroupingSeparator(' ');

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));

Sé que necesito usar DecimalFormatSymbols setGroupingSeparator, pero no sé cómo aplicarlo en mi BigDecimal
Funtime

1
@Funtime: no lo "aplicas en tu BigDecimal". Construye un NumberFormatobjeto con las propiedades deseadas y lo usa para formatear su BigDecimal. A BigDecimalsolo tiene un valor especificado, no tiene un formato especificado.
Joachim Sauer

1
Tenga en cuenta que el separador de miles es generalmente un espacio sin ruptura (cuando es un espacio)
cquezel

Tuve que cambiar la línea superior en la segunda opción a DecimalFormatSymbols symbols = new DecimalFormatSymbols (); para que esto funcione
PaperThick

14

pruebe este código para formatear como se usa en Brasil:

    DecimalFormat df = new DecimalFormat(
      "#,##0.00", 
      new DecimalFormatSymbols(new Locale("pt", "BR")));

    BigDecimal value = new BigDecimal(123456.00);

    System.out.println(df.format(value.floatValue()));

    // results: "123.456,00"

2
También intente esto, en el caso de JasperReports, forzando el formato correcto: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); envíe este parámetro para informar.
dellasavia

8

Si está utilizando un separador de miles para el tipo de datos Entero, use 1.

  1. Para tipo de datos enteros

String.format ("%, d \ n", 58625) y el resultado será 58,625

  1. Para los datos de punto flotante, escriba String.format ("% ,. 2f", 58625.21) y la salida será 58,625.21

Esta fue una epifanía. Sin embargo, realmente debe enfatizar que "," es solo una bandera, no el carácter que usa como separador de grupo. (Me tomó un tiempo encontrar el problema). Ver docs.oracle.com/javase/7/docs/api/java/util/Formatter.html
Vankog

5
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('|');
formatSymbols.setGroupingSeparator(' ');

String strange = "#,##0.###";
DecimalFormat df = new DecimalFormat(strange, formatSymbols);
df.setGroupingSize(4);

String out = df.format(new BigDecimal(300000).doubleValue());

System.out.println(out);

4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);

3

La respuesta aceptada tiene que modificarse realmente, de lo contrario no funcionará. Los getDecimalFormatSymbols hace una copia defensiva. Así,

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

La nueva línea es esta: formatter.setDecimalFormatSymbols (símbolos);


2

Para decimales :

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
dfDecimal.setDecimalFormatSymbols(symbols);
dfDecimal.setGroupingSize(3);
dfDecimal.setGroupingUsed(true);
System.out.println(dfDecimal.format(number));

1

Como se mencionó anteriormente, el siguiente enlace le proporciona el código de país específico para permitir que Java localice el número. Cada país tiene su propio estilo.

En el enlace de arriba encontrará el código de país que debe colocarse aquí:

...(new Locale(<COUNTRY CODE HERE>));

Suiza, por ejemplo, formatea los números de la siguiente manera:

1000.00 -> 1'000.00

código de país

Para lograr esto, los siguientes códigos me funcionan:

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
nf.setMaximumFractionDigits(2);
DecimalFormat df = (DecimalFormat)nf;
System.out.println(df.format(1000.00));

El resultado es el esperado:

1'000.00

1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20



Si bien este código puede proporcionar una solución a la pregunta, es mejor agregar contexto sobre por qué / cómo funciona. Esto puede ayudar a los futuros usuarios a aprender y aplicar ese conocimiento a su propio código. También es probable que reciba comentarios positivos de los usuarios en forma de votos positivos, cuando se explique el código.
borchvm
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.