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

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

Andreas Dolk
fuente
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

syloc
fuente
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()));
adarshr
fuente
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"
dellasavia
fuente
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
Waqas Ahmed
fuente
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);
Programador muerto
fuente
4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);
Charla
fuente
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);

Amio.io
fuente
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));
akelec
fuente
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
0xjacobb
fuente
1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20


Kadir Erturk
fuente
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