¿Cómo cambiar el separador decimal de DecimalFormat de coma a punto/punto?
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.
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();
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);
}
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.
String money = output.replace(',', '.');