Buộc điểm (“.”) Làm dấu phân tách thập phân trong java


103

Tôi hiện đang sử dụng mã sau để in đôi:

return String.format("%.2f", someDouble);

Điều này hoạt động tốt, ngoại trừ việc Java sử dụng dấu phân tách thập phân của Ngôn ngữ của tôi (dấu phẩy) trong khi tôi muốn sử dụng một điểm. Có cách nào làm dễ hơn không?


Nếu bạn cần sử dụng giá trị kép với các số thập phân chính xác, có thể bạn nên sử dụng BigDecimal thay vì double / Double. Xem liên kết này để biết các vấn đề bạn có thể gặp phải khi sử dụng biến kép. Bạn cũng có thể thử điều này: System.out.println (5.1d + 1.1d); - kết quả sẽ là 6.199999999999999 thay vì 6.2. Tôi nghĩ rằng ai đó đang tìm cách định dạng số với số thập phân là Chuỗi phải bỏ qua biến kép.
razvanone

Câu trả lời:


172

Sử dụng quá tải String.formatcho phép bạn chỉ định ngôn ngữ:

return String.format(Locale.ROOT, "%.2f", someDouble);

Nếu bạn chỉ định dạng một số - như bạn đang ở đây - thì việc sử dụng NumberFormatcó lẽ sẽ thích hợp hơn. Nhưng nếu bạn cần phần còn lại của các khả năng định dạng String.format, điều này sẽ hoạt động tốt.


6
Locale.ROOT trung lập hơn.
speedogoo

@speedogoo: Đã chỉnh sửa, mặc dù tôi nghi ngờ định dạng số nó không tạo ra sự khác biệt nào.
Jon Skeet

1
Vâng, nhưng bạn không cần phải chọn giữa US và UK. 😜
speedogoo

2
Locale.ROOT cũng an toàn trước những thay đổi có thể xảy ra trong tương lai đối với sự lựa chọn dấu phân tách thập phân của một quốc gia.
Attila Tanyi

IMO điều này không trả lời câu hỏi, thay vì Locale.setDefault (Ngôn ngữ mới ("en", "US")); như đã chỉ ra trong một câu trả lời khác. Đúng là có thể có những tác dụng phụ không mong muốn vì nó là toàn cầu, OTH với tư cách là lập trình viên, điều tôi thực sự muốn là mặc định toàn cầu là Hoa Kỳ vì mọi nơi khác trong mã của tôi, nơi tôi quan tâm đến ngôn ngữ, tôi làm điều đó một cách rõ ràng.
nyholku

21

Một giải pháp quyết liệt hơn là đặt Ngôn ngữ của bạn sớm trong chính ().

Giống:

Locale.setDefault(new Locale("en", "US"));

11
Đây là một câu trả lời rất khó giải quyết, vì nó có ảnh hưởng toàn cầu, do đó có thể gây ra nhiều thay đổi khác (có thể không mong muốn).
sleske

2
IMO đây là câu trả lời chính xác cho câu hỏi và bên cạnh tư cách lập trình viên, đây là điều tôi muốn. Tôi muốn Java sử dụng ngôn ngữ Hoa Kỳ theo mặc định ở mọi nơi trong mã của tôi, nơi tôi thực sự cần bản địa hóa, tôi sẽ làm cho nó rõ ràng trong mã của mình. Có lẽ chỉ là thói quen của tôi nhưng rất khó chịu khi printf / format sử dụng ngôn ngữ địa phương của tôi vì nguyên nhân sau đó 'dấu phẩy' thập phân hoàn toàn không tương thích với phần mềm khác (bất kỳ ai dùng Matlab) mà tôi sử dụng.
nyholku

10

Bạn có thể chuyển một Ngôn ngữ bổ sung cho java.lang.String.format cũng như java.io.PrintStream.printf (ví dụ: System.out.printf ()):

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

Điều này dẫn đến kết quả sau (trên PC của tôi):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

Xem String.format trong Java API.


4
Bạn cũng có thể sử dụng out.printf((Locale)null, ...)hoặc out.format((Locale)null, ...)để có được một biểu diễn độc lập về ngôn ngữ. (và cũng có Locale.ROOT)
eckes

10

Quá muộn nhưng như đã đề cập ở đây là cách sử dụng mẫu của NumberFormat(và lớp con của nó DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }

Tôi có cảm giác rằng việc tạo DecimalFormatSymbolsvà thiết lập dấu phân cách nên được thực hiện một lần, trước phương pháp này.
Dòng

0

Bạn có thể sử dụng NumberFormat và DecimalFormat.

Hãy xem liên kết này từ Hướng dẫn Java Ngôn ngữ Định dạng cụ thể

Phần có tiêu đề Định dạng Nhạy cảm theo ngôn ngữ là những gì bạn cần.


-3

Tôi đã gặp vấn đề tương tự .. được 55.1chuyển thành 55,10. Cách khắc phục nhanh (bẩn?) Của tôi là:

String.format("%.2f", value).replaceAll(",",".");


1
Điều đó chỉ hoạt động cho đến khi ai đó cố gắng chạy mã của bạn ở một ngôn ngữ khác. Không phải là một giải pháp thực sự. -1
Marco Freudenberger,
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.