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


Tengo este pequeño método loco que convierte valores Bigdecimales 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 alguna idea de cómo lograr esta pequeña hazaña?

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

Author: Kevin Panko, 2011-02-20

6 answers

Puede cambiar el separador estableciendo una configuración regional o utilizando los 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 format. Estos símbolos incluyen el separador decimal, el separador de agrupación, el signo, 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();
 275
Author: Chris,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-09-19 18:46:01

Europa es bastante enorme. No estoy seguro si usan el mismo formato en 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, utilice la configuración regional correcta.

 12
Author: Reno,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-07-27 07:51:29
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
 8
Author: Imran Khan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-11 08:35:03

BigDecimal no parece respetar la configuración regional.

Locale.getDefault(); //returns sl_SI

La localización eslovena debe tener una coma decimal. Supongo que tenía ideas erróneas extrañas 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 a un error humano (olvidé confirmar datos y estaba mirando la cosa equivocada).

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

También como otros mencionados usando formateadores funciona bien. Simplemente use formateadores, lo mismo para el frontend de JSF, los formateadores hacen el trabajo correctamente y son conscientes de la configuración regional.

 5
Author: Neikius,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2012-03-27 07:20:02
String money = output.replace(',', '.');
 3
Author: Thakhani Tharage,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-09 22:53:35

Simplemente sustitúyase".'with', ' en la interfaz de usuario final

import java.text.DecimalFormat;
public MyClass{
    private String netAmount;
    private static DecimalFormat twoDecimalForm = new DecimalFormat("00.00");

    public MyClass(double amount){
        //converting to required decimal format in constructor or/and setter
        this.amount=twoDecimalForm.format(amount);
    }

    public String getAmount() {
        //replacing decimal point with  comma so that in JSP ELs you'll get it in comma format
        return amount.replace(".",",");
    }
    public void setAmount(String amount) {
        this.amount = amount;
    }
}
 -2
Author: ShAkKiR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-06-25 05:41:05