Làm cách nào để thay đổi dấu tách thập phân của DecimalFormat từ dấu phẩy sang dấu chấm / điểm?


204

Tôi có phương pháp điên rồ nhỏ này để chuyển đổi các giá trị BigDecimal thành các Chuỗi đẹp và dễ đọc.

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

Tuy nhiên, nó cũng tạo ra một phân tách nhóm được gọi là ","làm cho tất cả các giá trị của tôi xuất hiện như thế này:

xxx,xxx

Tôi cần dấu phân cách là dấu chấm hoặc điểm chứ không phải dấu phẩy. Có ai có manh mối về cách thực hiện chiến công nhỏ này không?

Tôi đã đọc và đặc biệt là cái này đến chết bây giờ nhưng tôi không thể tìm ra cách nào để thực hiện điều này. Tôi đang tiếp cận điều này sai cách? Có một cách thanh lịch hơn nhiều để làm điều này? Thậm chí có thể là một giải pháp chiếm các đại diện số địa phương khác nhau, vì dấu phẩy sẽ hoàn hảo theo tiêu chuẩn châu Âu.


Câu trả lời:


323

Bạn có thể thay đổi dấu phân cách bằng cách đặt ngôn ngữ hoặc sử dụng DecimalFormatSymbols .

Nếu bạn muốn phân tách nhóm là một điểm, bạn có thể sử dụng ngôn ngữ châu Âu:

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

Ngoài ra, bạn có thể sử dụng lớp DecimalFormatSymbols để thay đổi các ký hiệu xuất hiện trong các số được định dạng được tạo bởi phương thức định dạng. Những ký hiệu này bao gồm dấu tách thập phân, dấu tách nhóm, dấu trừ và dấu phần trăm, trong số các dấu khác:

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

currentLocale có thể được lấy từ Locale.getDefault () tức là:

Locale currentLocale = Locale.getDefault();

1
bạn có thể sử dụng applicationPotype trên định dạng thập phân để nhận được
danh dự 0,00

Tôi đã thay đổi otherSymbols.setDecimalSeparator (','); như otherSymbols.setDecimalSeparator ('.'); Cảm ơn. Nó hoạt động cho tôi.
Aakanksha

2
Đó là định dạng trông như thế nào, ví dụ: String formatString = "#,###,###,##0.00";xem docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html để biết cú pháp
Vulpo

1
"Bạn có thể sử dụng một địa điểm châu Âu". Chà, bạn không thể sử dụng bất kỳ miền địa phương nào từ châu Âu vì Locale.UKsẽ quay lại 1,567.90 chứ không phải 1.567,90
Junior Mayhé

Lưu ý bên lề: NumberFormat.getNumberInstance()có thể chạy chậm bất thường trên một số thiết bị Android 7. Một thay thế là String.format()chạy nhanh chóng. Xem stackoverflow.com/questions/2379221/java-currency-number-format
Mr-IDE

14

Châu Âu khá lớn. Tôi không chắc họ có sử dụng cùng một định dạng không. Tuy nhiên này hay này câu trả lời sẽ được giúp đỡ.

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

Tức là sử dụng đúng miền địa phương.


1
Thật vậy thưa ngài! Ở Vương quốc Anh "£ 1,234.00" sẽ được nhìn thấy, trong khi ở Pháp dự kiến ​​sẽ có "1 234,00 €" (dấu tách nhóm, dấu tách thập phân, ký hiệu tiền tệ và vị thế tiền tệ đã thay đổi).
Vulpo

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

5

BigDecimal dường như không tôn trọng cài đặt Địa điểm.

Locale.getDefault(); //returns sl_SI

Ngôn ngữ tiếng Slovenia nên có dấu phẩy thập phân. Đoán tôi có những quan niệm sai lầm kỳ lạ về con số.

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

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

Tôi đã chỉnh sửa một phần thông điệp của mình mà không có ý nghĩa gì vì nó được chứng minh là do lỗi của con người (quên cam kết dữ liệu và đang xem xét điều sai).

Giống như BigDecimal có thể nói cho bất kỳ hàm Java .toString () nào. Tôi đoán đó là tốt trong một số cách. Tuần tự hóa ví dụ hoặc gỡ lỗi. Có một đại diện chuỗi duy nhất.

Ngoài ra, như những người khác đã đề cập bằng cách sử dụng trình định dạng hoạt động tốt. Chỉ cần sử dụng các trình định dạng, tương tự cho giao diện JSF, các trình định dạng thực hiện công việc đúng cách và nhận thức được miền địa phương.


Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.