¿Cómo cambiar el separador decimal de DecimalFormat de coma a punto / punto?

204

Tengo este pequeño método loco que convierte los valores de BigDecimal en cadenas agradables y legibles.

private String formatBigDecimal(BigDecimal bd){
    DecimalFormat df = new DecimalFormat();
    df.setMinimumFractionDigits(3);
    df.setMaximumFractionDigits(3);
    df.setMinimumIntegerDigits(1);
    df.setMaximumIntegerDigits(3);
    df.setGroupingSize(20);
    return df.format(bd);
}

Sin embargo, también produce un llamado separador de agrupación ","que hace que todos mis valores salgan así:

xxx,xxx

Necesito que el separador sea un punto o un punto y no una coma. ¿Alguien tiene idea de cómo lograr esta pequeña hazaña?

He leído esto y, en particular, esto hasta la muerte, pero no puedo encontrar una manera de hacerlo. ¿Me estoy acercando a esto de la manera incorrecta? ¿Hay una manera mucho más elegante de hacer esto? Quizás incluso una solución que represente diferentes representaciones de números locales, ya que la coma sería perfecta para los estándares europeos.

MiraFayless
fuente

Respuestas:

323

Puede cambiar el separador configurando una configuración regional o utilizando los símbolos DecimalFormatSymbols .

Si desea que el separador de agrupación sea un punto, puede usar una configuración regional europea:

NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
DecimalFormat df = (DecimalFormat)nf;

Alternativamente, puede usar la clase DecimalFormatSymbols para cambiar los símbolos que aparecen en los números formateados producidos por el método de formato. Estos símbolos incluyen el separador decimal, el separador de agrupación, el signo menos y el signo de porcentaje, entre otros:

DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols(currentLocale);
otherSymbols.setDecimalSeparator(',');
otherSymbols.setGroupingSeparator('.'); 
DecimalFormat df = new DecimalFormat(formatString, otherSymbols);

currentLocale se puede obtener de Locale.getDefault () es decir:

Locale currentLocale = Locale.getDefault();
Chris
fuente
1
puedes usar applyPattern en el formato decimal para obtener tu .00
krystan honor
He cambiado otherSymbols.setDecimalSeparator (','); como otherSymbols.setDecimalSeparator ('.'); Gracias. Funciona para mí.
Aakanksha
2
así es como se ve el formato, por ej. String formatString = "#,###,###,##0.00"; ver docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html para la sintaxis
Vulpo
1
"Puedes usar una configuración regional europea". Bueno, no puede usar ninguna configuración regional de Europa porque Locale.UKvolverá1,567.90 y no 1.567,90
Junior Mayhé
Nota al margen: NumberFormat.getNumberInstance()puede ejecutarse de manera inusualmente lenta en algunos dispositivos Android 7. Una alternativa es la String.format()que se ejecuta rápidamente. Ver stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE
14

Europa es bastante grande. No estoy seguro si usan el mismo formato por todas partes. Sin embargo, esta o esta respuesta será de ayuda.

String text = "1,234567";
NumberFormat nf_in = NumberFormat.getNumberInstance(Locale.GERMANY);
double val = nf_in.parse(text).doubleValue();

NumberFormat nf_out = NumberFormat.getNumberInstance(Locale.UK);
nf_out.setMaximumFractionDigits(3);
String output = nf_out.format(val);

Es decir, usar la configuración regional correcta.

Reno
fuente
1
De hecho señor! En el Reino Unido se ve "£ 1,234.00", mientras que en Francia se espera "1 234,00 €" (el separador de grupo, el separador decimal, el símbolo de moneda y la posición de la moneda han cambiado).
Vulpo
9
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
Imran Khan
fuente
5

BigDecimal no parece respetar la configuración regional.

Locale.getDefault(); //returns sl_SI

La configuración regional eslovena debe tener una coma decimal. Supongo que tenía extraños conceptos erróneos con respecto a los números.

a = new BigDecimal("1,2") //throws exception
a = new BigDecimal("1.2") //is ok

a.toPlainString() // returns "1.2" always

He editado una parte de mi mensaje que no tenía sentido, ya que resultó ser debido al error humano (olvidé confirmar los datos y estaba mirando lo incorrecto).

Lo mismo que BigDecimal se puede decir para cualquier función Java .toString (). Supongo que eso es bueno en algunos aspectos. Serialización por ejemplo o depuración. Hay una representación de cadena única.

Además, como otros mencionaron usando formateadores, funciona bien. Solo use formateadores, lo mismo para la interfaz JSF, los formateadores hacen el trabajo correctamente y conocen la configuración regional.

Neikius
fuente