Bagaimana cara mengubah pemisah desimal dari DecimalFormat dari koma ke titik / titik?

204

Saya memiliki metode gila kecil ini yang mengubah nilai BigDecimal menjadi String yang bagus dan mudah dibaca.

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

Namun demikian, juga menghasilkan pemisah pengelompokan yang disebut ","yang membuat semua nilai saya keluar seperti ini:

xxx,xxx

Saya membutuhkan separator untuk menjadi titik atau titik dan bukan koma. Apakah ada yang punya petunjuk tentang bagaimana mencapai prestasi kecil ini?

Saya telah membaca ini dan khususnya ini sampai mati sekarang, tetapi saya tidak dapat menemukan cara untuk menyelesaikan ini. Apakah saya mendekati ini dengan cara yang salah? Apakah ada cara yang jauh lebih elegan untuk melakukan ini? Mungkin bahkan solusi yang mewakili representasi nomor lokal yang berbeda, karena koma akan sempurna dengan standar Eropa.

MiraFayless
sumber

Jawaban:

323

Anda dapat mengubah pemisah dengan mengatur lokal atau menggunakan DecimalFormatSymbols .

Jika Anda ingin pemisah pengelompokan menjadi sebuah titik, Anda dapat menggunakan lokal Eropa:

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

Atau Anda dapat menggunakan kelas DecimalFormatSymbols untuk mengubah simbol yang muncul dalam angka yang diformat yang dihasilkan oleh metode format. Simbol-simbol ini termasuk pemisah desimal, pemisah pengelompokan, tanda minus, dan tanda persen, antara lain:

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

currentLocale dapat diperoleh dari Locale.getDefault () yaitu:

Locale currentLocale = Locale.getDefault();
Chris
sumber
1
Anda dapat menggunakan applyPattern pada format desimal untuk mendapatkan .00
krystan honor
Saya telah mengubah otherSymbols.setDecimalSeparator (','); sebagai otherSymbols.setDecimalSeparator ('.'); Terima kasih. Ini bekerja untuk saya.
Aakanksha
2
seperti apa bentuk formatnya, mis. String formatString = "#,###,###,##0.00";lihat docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html untuk sintaksis
Vulpo
1
"Anda dapat menggunakan lokal Eropa". Ya, Anda tidak dapat menggunakan lokal dari Eropa karena Locale.UKakan kembali 1,567.90 dan tidak 1.567,90
Junior Mayhé
Catatan: NumberFormat.getNumberInstance()dapat berjalan sangat lambat pada beberapa perangkat Android 7. Alternatifnya adalah String.format()yang berjalan cepat. Lihat stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE
14

Eropa cukup besar. Saya tidak yakin apakah mereka menggunakan format yang sama. Namun ini atau ini jawabannya akan sangat membantu.

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

Yaitu menggunakan lokal yang benar.

Reno
sumber
1
Memang pak! Di Inggris "£ 1,234.00" harus dilihat, sedangkan di Prancis "1 234,00 €" diharapkan (pemisah grup, pemisah desimal, simbol mata uang, dan posisi mata uang telah berubah).
Vulpo
9
public String getGermanCurrencyFormat(double value) {
    NumberFormat nf = NumberFormat.getNumberInstance(Locale.GERMAN);
    nf.setGroupingUsed(true);
    return "€ " + nf.format(value);
}
Imran Khan
sumber
5

BigDecimal tampaknya tidak menghargai pengaturan Lokal.

Locale.getDefault(); //returns sl_SI

Lokal Slovenia harus memiliki koma desimal. Kira saya punya kesalahpahaman aneh tentang angka.

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

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

Saya telah mengedit bagian dari pesan saya yang tidak masuk akal karena terbukti karena kesalahan manusia (lupa melakukan data dan melihat hal yang salah).

Sama seperti BigDecimal dapat dikatakan untuk semua fungsi Java .toString (). Saya kira itu bagus dalam beberapa hal. Serialisasi misalnya atau debugging. Ada representasi string yang unik.

Juga seperti orang lain yang disebutkan menggunakan formatters berfungsi OK. Cukup gunakan formatters, sama untuk frontend JSF, formatters melakukan pekerjaan dengan benar dan mengetahui lokal.

Neikius
sumber