Pregunta

Yo tengo esta pequeña locura método que convierte BigDecimal valores en agradable y legible Cadenas.

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 se produce lo que se llama un separador de agrupación "," que hace que todos mis valores salir como este:

xxx,xxx

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

He leído este y, en particular, este a la muerte, pero ahora no puedo encontrar una manera de hacer esto.Estoy acercándose por el camino equivocado?Es allí una manera mucho más elegante manera de hacerlo?Tal vez incluso una solución con la que cuentas para diferentes locales número de representaciones, ya que la coma sería perfecto para los estándares Europeos.

¿Fue útil?

Solución

Usted puede cambiar el separador, ya sea mediante el establecimiento de una configuración regional o el uso de la DecimalFormatSymbols.

Si desea que la agrupación separador de ser un punto, puede utilizar una configuración regional de europa:

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

Alternativamente, usted puede utilizar el DecimalFormatSymbols clase para cambiar los símbolos que aparecen en el formato de los números 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 puede ser obtenido a partir de la configuración Regional.getDefault (), es decir:

Locale currentLocale = Locale.getDefault();

Otros consejos

Europa es bastante enorme.No estoy seguro de si utilizan el mismo formato en todo.Sin embargo este o este la respuesta va a 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);

I. e.uso de la configuración regional correcta.

public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}

BigDecimal no parecen respetar la configuración Regional.

Locale.getDefault(); //returns sl_SI

Esloveno regional debería haber una coma decimal.Supongo que tenía extrañas ideas erróneas 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 ningún sentido, ya que demostró ser debido el error humano (se olvidó de confirmar los datos y estaba buscando en el lugar equivocado).

Mismo como BigDecimal puede decirse para cualquier Java .toString() funciones.Supongo que es buena en algunos aspectos.La serialización, por ejemplo, o la depuración.No hay una única representación de cadena.

También como otros mencionan el uso de los formateadores funciona OK.Sólo el uso de los formateadores, lo mismo para el JSF frontend, formateadores de hacer el trabajo correctamente y son conscientes de la configuración regional.

String money = output.replace(',', '.');
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top