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

Resuelto MiraFayless asked hace 54 años • 8 respuestas

Tengo este pequeño método loco que convierte valores 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 el 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. ¿Estoy abordando esto de manera incorrecta? ¿Existe una forma mucho más elegante de hacer esto? Quizás 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.

MiraFayless avatar Jan 01 '70 08:01 MiraFayless
Aceptado

Puede cambiar el separador configurando una configuración regional o usando DecimalFormatSymbols .

Si desea que el separador de agrupación sea un punto, puede utilizar 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 avatar Feb 19 '2011 23:02 Chris

Esto funcionó en mi caso:

DecimalFormat df2 = new DecimalFormat("#.##");           
df2.setDecimalFormatSymbols(DecimalFormatSymbols.getInstance(Locale.ENGLISH));
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
Imran Khan avatar Oct 15 '2011 14:10 Imran Khan

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 conceptos erróneos extraños sobre los números.

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

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

Edité una parte de mi mensaje que no tenía sentido ya que resultó ser debido a un error humano (olvidé enviar datos y estaba mirando algo incorrecto).

Lo mismo que BigDecimal se puede decir de 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, el uso de formateadores funciona bien. Simplemente use formateadores, lo mismo para la interfaz JSF, los formateadores hacen el trabajo correctamente y conocen la configuración regional.

Neikius avatar Mar 26 '2012 15:03 Neikius
String money = output.replace(',', '.');
Thakhani Tharage avatar Aug 01 '2013 14:08 Thakhani Tharage