Como alterar o separador decimal de DecimalFormat de vírgula para ponto / ponto?

204

Eu tenho esse pequeno método maluco que converte valores BigDecimal em Strings agradáveis ​​e legíveis.

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);
}

No entanto, também produz um chamado separador de agrupamento ","que faz com que todos os meus valores saiam assim:

xxx,xxx

Eu preciso que o separador seja um ponto ou um ponto e não uma vírgula. Alguém tem alguma idéia de como realizar esse pequeno feito?

Eu li isso e, em particular, este à morte, mas agora não consigo encontrar uma maneira de conseguir este feito. Estou abordando isso da maneira errada? Existe uma maneira muito mais elegante de fazer isso? Talvez até uma solução que represente diferentes representações numéricas locais, já que a vírgula seria perfeita para os padrões europeus.

MiraFayless
fonte

Respostas:

323

Você pode alterar o separador definindo um código de idioma ou usando o DecimalFormatSymbols .

Se você deseja que o separador de agrupamento seja um ponto, use um código de idioma europeu:

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

Como alternativa, você pode usar a classe DecimalFormatSymbols para alterar os símbolos que aparecem nos números formatados produzidos pelo método format. Esses símbolos incluem o separador decimal, o separador de agrupamento, o sinal de menos e o sinal de porcentagem, entre outros:

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

currentLocale pode ser obtido em Locale.getDefault () ou seja:

Locale currentLocale = Locale.getDefault();
Chris
fonte
1
você pode usar applyPattern no formato decimal para obter sua .00
krystan honor
Eu mudei otherSymbols.setDecimalSeparator (','); como otherSymbols.setDecimalSeparator ('.'); Obrigado. Funciona para mim.
Aakanksha
2
é como o formato é, por exemplo, String formatString = "#,###,###,##0.00";consulte docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html para sintaxe
Vulpo
1
"Você pode usar um local europeu". Bem, você não pode usar nenhum código de idioma da Europa, pois Locale.UKretornará 1,567.90 e não 1.567,90
Junior Mayhé
Nota lateral: NumberFormat.getNumberInstance()pode ser executado de maneira incomum e lenta em alguns dispositivos Android 7. Uma alternativa é String.format()que é executado rapidamente. Consulte stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE
14

A Europa é bem grande. Não tenho certeza se eles usam o mesmo formato todo. No entanto, esta ou esta resposta será útil.

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);

Ou seja, use o local correto.

Reno
fonte
1
De fato, senhor! No Reino Unido, "£ 1.234,00" é visto, enquanto na França "1 234,00 €" é esperado (separador de grupo, separador decimal, símbolo e posição da moeda foram alterados).
Vulpo 31/03
9
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
Imran Khan
fonte
5

BigDecimal parece não respeitar as configurações de localidade.

Locale.getDefault(); //returns sl_SI

O código de idioma esloveno deve ter uma vírgula decimal. Acho que eu tinha estranhos conceitos errados sobre números.

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

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

Eu editei uma parte da minha mensagem que não fazia sentido, pois provou ser devido ao erro humano (esqueci de confirmar os dados e estava olhando para a coisa errada).

O mesmo que BigDecimal pode ser dito para qualquer função Java .toString (). Eu acho que isso é bom em alguns aspectos. Serialização, por exemplo, ou depuração. Há uma representação de string exclusiva.

Além disso, como outros mencionados usando os formatadores, funciona bem. Basta usar os formatadores, o mesmo para o front-end JSF, os formatadores fazem o trabalho corretamente e estão cientes da localidade.

Neikius
fonte