Định dạng thập phân kép trong Java


118

Tôi đang gặp một số vấn đề khi định dạng số thập phân của một đôi. Nếu tôi có giá trị kép, ví dụ: 4.0, làm cách nào để định dạng số thập phân để thay vào đó là 4.00?


Hãy thử sử dụng String.format()hoặc java.text.Format.
Code-Apprentice,


Câu trả lời:


218

Một trong những cách sẽ là sử dụng NumberFormat .

NumberFormat formatter = new DecimalFormat("#0.00");     
System.out.println(formatter.format(4.0));

Đầu ra:

4,00


1
Vâng, nhưng tôi không muốn dấu phẩy, tôi muốn một dấu thập phân.
Christoffer

Tôi nhận được một dấu phẩy. Đây là những gì tôi đã làm. "biến kép; Định dạng NumberFormat = new DecimalFormat (" # 0.00 "); System.out.println (formatter.format (biến));
Christoffer

đầu ra cho đó là X, 00 chứ không phải X.00
Christoffer

9
Bạn nhận được dấu phẩy vì ngôn ngữ mặc định được sử dụng bởi JVM của bạn, ngôn ngữ này có thể khác với ngôn ngữ của Nambari. Hãy xem NumberFormat javadoc: docs.oracle.com/javase/1.4.2/docs/api/java/text/…
Michael Zilbermann

1
Như zim2001 đã chỉ, ngôn ngữ của bạn có thể khác. Đọc liên kết được cung cấp trong câu trả lời của tôi. Ở cuối bạn sẽ tìm thấy thông tin về điều này.
kosa

73

Với Java 8, bạn có thể sử dụng formatphương pháp ..: -

System.out.format("%.2f", 4.0); // OR

System.out.printf("%.2f", 4.0); 
  • fđược sử dụng cho floatinggiá trị điểm ..
  • 2 sau số thập phân biểu thị, số vị trí thập phân sau .

Đối với hầu hết các phiên bản Java, bạn có thể sử dụng DecimalFormat: -

    DecimalFormat formatter = new DecimalFormat("#0.00");
    double d = 4.0;
    System.out.println(formatter.format(d));

43

Sử dụng String.format :

String.format("%.2f", 4.52135);

Theo tài liệu:

Ngôn ngữ luôn được sử dụng là ngôn ngữ được trả về Locale.getDefault().


8
String.format cũng chấp nhận ngôn ngữ làm tham số đầu tiên để giải thích cho việc định dạng dấu thập phân.
Vincent Mimoun-Prat,

4
Để tránh các dấu thập phân theo ngôn ngữ cụ thể (chẳng hạn như dấu phẩy), hãy chỉ định ngôn ngữ Hoa Kỳ: String.format (Locale.US, "%. 2f", 4.52135);
Alexander233

3
Tôi sẽ nói "sử dụng dấu chấm cụ thể theo ngôn ngữ Hoa Kỳ làm dấu thập phân, chỉ định ngôn ngữ Hoa Kỳ" .. ý tưởng rằng thói quen của Hoa Kỳ là đúng và mọi thứ khác đều là những thứ "dân gian" khiến tôi phát điên.
Simone Gianni

@SimoneGianni Đừng đưa ra những giả định ngu ngốc, một số người có thể cần số thập phân là dấu chấm. Ví dụ: tôi đang viết một hàm xuất tài liệu CSV và tôi không thể có dấu phẩy vì ký tự dấu phẩy là dấu phân cách.
Kaiser Keister

19

Sử dụng String.format, bạn có thể làm điều này:

double price = 52000;
String.format("$%,.2f", price);

Lưu ý dấu phẩy khiến câu trả lời này khác với câu trả lời của @ Vincent

Đầu ra:

$52,000.00

Một tài nguyên tốt để định dạng là trang java chính thức về chủ đề này


6

Bạn luôn có thể sử dụng phương thức tĩnh printf from System.out - sau đó bạn sẽ triển khai trình định dạng tương ứng; điều này giúp tiết kiệm dung lượng heap mà trong đó các ví dụ khác yêu cầu bạn làm.

Ví dụ:

System.out.format("%.4f %n", 4.0); 

System.out.printf("%.2f %n", 4.0); 

Tiết kiệm dung lượng heap là một phần thưởng khá lớn, tuy nhiên tôi có ý kiến ​​rằng ví dụ này dễ quản lý hơn nhiều so với bất kỳ câu trả lời nào khác, đặc biệt là vì hầu hết các lập trình viên đều biết hàm printf từ C (Java thay đổi hàm / phương thức một chút).


1
@Baz Tôi có thiếu một chi tiết quan trọng ở đây không, không có printStream nào được đề cập. OP đang yêu cầu trợ giúp định dạng (có thể được giải quyết dễ dàng hơn bằng cách xem tài liệu Java) cho luồng đầu ra tiêu chuẩn. Giải thích.
Lewis Robbins

Lỗi của tôi. Đã xem sai phiên bản javadoc (1.4). BTW: outPrintStream.
Baz

@Baz Không phải lo lắng. Có, tôi cho rằng đó là lớp mà bạn đang đề cập đến, trong tất cả các cuốn sách của tôi, printf được gọi là phương thức tĩnh từ System.out (vì các phương thức đó là tĩnh).
Lewis Robbins

1
Nói chính xác, printflà một phương thức tĩnh của PrintStream. Xem tại đây ;) Nhưng dù sao thì +1.
Baz

@Baz Từ tài liệu, lớp printStream kế thừa System.out. Có lẽ tôi có thể sai - mặc dù việc kế thừa một phương thức tĩnh khá lạ (thậm chí có thể xảy ra)? Bạn, tôi mong đợi chính xác mặc dù.
Lewis Robbins

4
double d = 4.0;
DecimalFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
System.out.println(nf.format("#.##"));


1

Một phương pháp thay thế là sử dụng setMinimumFractionDigitsphương pháp từNumberFormat lớp.

Ở đây về cơ bản bạn chỉ định bao nhiêu số bạn muốn xuất hiện sau dấu thập phân.

Vì vậy, một đầu vào của 4.0sẽ tạo ra 4.00, giả sử số tiền được chỉ định của bạn là 2.

Tuy nhiên, nếu thông tin Doubleđầu vào của bạn chứa nhiều hơn số lượng được chỉ định, nó sẽ chiếm số lượng tối thiểu được chỉ định, sau đó thêm một chữ số nữa được làm tròn lên / xuống

Ví dụ: 4.15465454với số lượng tối thiểu là 2 được chỉ định sẽ tạo ra4.155

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
Double myVal = 4.15465454;
System.out.println(nf.format(myVal));

Thử trực tuyến


1

Có nhiều cách bạn có thể làm điều này. Chúng được đưa ra dưới đây:

Giả sử số ban đầu của bạn được đưa ra dưới đây:

 double number = 2354548.235;

Sử dụng NumberFormat:

NumberFormat formatter = new DecimalFormat("#0.00");
    System.out.println(formatter.format(number));

Sử dụng String.format:

System.out.println(String.format("%,.2f", number));

Sử dụng DecimalFormat và mẫu:

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
        DecimalFormat decimalFormatter = (DecimalFormat) nf;
        decimalFormatter.applyPattern("#,###,###.##");
        String fString = decimalFormatter.format(number);
        System.out.println(fString);

Sử dụng DecimalFormat và mẫu

DecimalFormat decimalFormat = new DecimalFormat("############.##");
        BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
        System.out.println(formattedOutput);

Trong mọi trường hợp, đầu ra sẽ là: 2354548,23

Ghi chú :

Trong quá trình làm tròn, bạn có thể thêm RoundingModevào định dạng của mình. Dưới đây là một số chế độ làm tròn được đưa ra dưới đây:

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

Đây là hàng nhập khẩu :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

1

Bạn có thể sử dụng bất kỳ một trong các phương pháp dưới đây

  1. Nếu bạn đang sử dụng java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));

    HOẶC LÀ

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. Nếu bạn muốn chuyển nó thành định dạng chuỗi đơn giản

    System.out.println(String.format("%.2f", 4.0)); 

Tất cả mã trên sẽ in ra 4.00


0

Hoạt động 100%.

import java.text.DecimalFormat;

public class Formatting {

    public static void main(String[] args) {
        double value = 22.2323242434342;
        // or  value = Math.round(value*100) / 100.0;

        System.out.println("this is before formatting: "+value);
        DecimalFormat df = new DecimalFormat("####0.00");

        System.out.println("Value: " + df.format(value));
    }

}

-3

Lần nhập khẩu đầu tiên NumberFormat. Sau đó thêm cái này:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

Điều này sẽ cung cấp cho bạn hai chữ số thập phân và đặt một ký hiệu đô la nếu nó giao dịch với tiền tệ.

import java.text.NumberFormat;
public class Payroll 
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
    int hoursWorked = 80;
    double hourlyPay = 15.52;

    double grossPay = hoursWorked * hourlyPay;
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

    System.out.println("Your gross pay is " + currencyFormatter.format(grossPay));
    }

}

1
Câu hỏi không phải là hiển thị một loại tiền tệ và được trả lời chính xác hơn bằng cách sử dụng các chức năng định dạng) như được mô tả trong các câu trả lời khác).
yacc

-4

Bạn có thể làm như sau:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

1
Không hoạt động bởi vì nó sử dụng ##thay vì00
Joaquin Iurchuk

-4

Tôi biết rằng đây là một chủ đề cũ, nhưng nếu bạn thực sự muốn có dấu chấm thay vì dấu phẩy, chỉ cần lưu kết quả của bạn dưới dạng X, 00 thành Chuỗi và sau đó chỉ cần thay đổi nó trong một khoảng thời gian để bạn nhận được X.00

Cách đơn giản nhất là bạn chỉ cần sử dụng thay thế.

String var = "X,00";
String newVar = var.replace(",",".");

Đầu ra sẽ là X.00 mà bạn muốn. Ngoài ra, để dễ dàng, bạn có thể thực hiện tất cả cùng một lúc và lưu nó vào một biến kép:

Double var = Double.parseDouble(("X,00").replace(",",".");

Tôi biết rằng câu trả lời này không hữu ích ngay bây giờ nhưng có thể ai đó kiểm tra diễn đàn này sẽ tìm kiếm một giải pháp nhanh chóng như thế này.

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.