Làm cách nào tôi có thể định dạng số Chuỗi để có dấu phẩy và làm tròn?


142

Cách tốt nhất để định dạng số sau đây được cung cấp cho tôi dưới dạng Chuỗi là gì?

String number = "1000500000.574" //assume my value will always be a String

Tôi muốn đây là một Chuỗi có giá trị: 1,000,500,000.57

Làm thế nào tôi có thể định dạng nó như vậy?

Câu trả lời:


256

Bạn có thể muốn nhìn vào DecimalFormatlớp học; nó hỗ trợ các địa phương khác nhau (ví dụ: ở một số quốc gia sẽ được định dạng 1.000.500.000,57thay thế).

Bạn cũng cần chuyển đổi chuỗi đó thành một số, điều này có thể được thực hiện với:

double amount = Double.parseDouble(number);

Mẫu mã:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));

bạn có thể đưa ra một ví dụ về cách tôi có thể sử dụng NumberFormat với trường hợp cụ thể này không?
Sheehan Alam

1
bạn cũng có thể sử dụng giải pháp bên dưới - Chuỗi tĩnh công khai getRound OfferValue (giá trị kép) {DecimalFormat df = new DecimalFormat ("##, ##, ##, ##, ##, ##, ## 0.00"); trả về df.format (giá trị); }
Jitendra Nath

Tôi cũng thích số 0 trước điểm như DecimalFormat formatter = new DecimalFormat ("#, ## 0.00"); - nhận được 0,00 cho âm 0 đối với tôi
Leo

46

Điều này cũng có thể được thực hiện bằng String.format (), có thể dễ dàng hơn và / hoặc linh hoạt hơn nếu bạn định dạng nhiều số trong một chuỗi.

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

Đối với chuỗi định dạng "%, 2f" - "," có nghĩa là các nhóm chữ số riêng biệt có dấu phẩy và ".2" có nghĩa là làm tròn đến hai vị trí sau số thập phân.

Để tham khảo về các tùy chọn định dạng khác, hãy xem https://docs.oracle.com/javase/tutorial/java/data/numberformat.html


42

Khi bạn đã chuyển đổi Chuỗi của mình thành một số, bạn có thể sử dụng

// format the number for the default locale
NumberFormat.getInstance().format(num)

hoặc là

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)

Làm thế nào để cả hai xác định miền địa phương và làm tròn đến (nói) 2 số thập phân?
Jonik

6
À, đừng bận tâm, đã tìm thấy nó:new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
Jonik

16

Vì đây là kết quả số một của Google format number commas java, đây là câu trả lời dành cho những người đang làm việc với toàn bộ số và không quan tâm đến số thập phân.

String.format("%,d", 2000000)

đầu ra:

2,000,000

cũng hoạt động cho phao, ví dụ, printf ("%, f \ n", binaryNumber)
philwalk

12

Tôi đã tạo tiện ích định dạng của riêng mình. Điều này cực kỳ nhanh trong việc xử lý định dạng cùng với việc cung cấp cho bạn nhiều tính năng :)

Nó hỗ trợ:

  • Định dạng dấu phẩy Ví dụ 1234567 trở thành 1,234,567.
  • Tiền tố với "Nghìn (K), Triệu (M), Tỷ (B), Trillion (T)".
  • Độ chính xác từ 0 đến 15.
  • Định cỡ lại chính xác (Có nghĩa là nếu bạn muốn độ chính xác 6 chữ số, nhưng chỉ có 3 chữ số khả dụng thì nó buộc nó thành 3).
  • Giảm tiền tố (Có nghĩa là nếu tiền tố bạn chọn quá lớn, nó sẽ hạ thấp thành tiền tố phù hợp hơn).

Mã có thể được tìm thấy ở đây . Bạn gọi nó như thế này:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

Tôi cũng nên chỉ ra điều này không xử lý hỗ trợ thập phân, nhưng rất hữu ích cho các giá trị nguyên. Ví dụ trên sẽ hiển thị "1.23M" là đầu ra. Có lẽ tôi có thể thêm hỗ trợ thập phân, nhưng tôi đã không thấy sử dụng quá nhiều cho nó kể từ đó tôi cũng có thể hợp nhất nó thành một loại lớp BigInteger xử lý các mảng char [] nén cho các tính toán toán học.


2
Điều này là tốt nếu bạn chỉ làm việc bằng tiếng Anh. Đề nghị của tôi là tránh những điều như vậy làm bực mình bữa tối của những người dùng không phải tiếng Anh của tôi vì họ không thể hiểu ý nghĩa Khay Mý nghĩa của nó
rishabhmhjn

@rishabhmhjn nhưng ... bạn không thể chỉnh nó để sửa đổi thành bất kỳ chữ cái nào bạn cần? là xui xẻo của bạn là lỗi của anh ấy? : o và những gì anh ấy tạo ra khá tuyệt, mặc dù liên kết dường như không có sẵn ngay bây giờ ..
Sức mạnh của Bảo Bình vào

@AquariusPower vấn đề là, ví dụ, số Nhật Bản không tuân theo hệ thống số liệu. Số của chúng giống như 1 百 cho 100, 1 cho 1000, 1 cho 10000, sau đó trở thành 1 cho 1000.0000. Nhóm của tôi đã làm việc trên một cái gì đó tương tự trong Javascript. Bạn có thể sử dụng logic được đề cập trong phần này: github.com/statusbrew/angular-bignumber
rishabhmhjn

Tìm thấy mã cũ của tôi cho điều này vì vậy tôi đã tải lại nó vào GitHub. Liên kết trong bình luận đã được cập nhật.
Jeremy Trifilo

6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}

6

bạn cũng có thể sử dụng giải pháp dưới đây -

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}

4

Bạn có thể thực hiện toàn bộ chuyển đổi trong một dòng, sử dụng mã sau:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

Hai dấu # cuối cùng trong hàm tạo DecimalFormat cũng có thể là 0. Cả hai cách đều hoạt động.


3

Câu trả lời đầu tiên hoạt động rất tốt, nhưng đối với ZERO / 0, nó sẽ định dạng là 0,00

Do đó định dạng #, ## 0,00 hoạt động tốt với tôi. Luôn kiểm tra các số khác nhau như 0/100 / 2334.30 và các số âm trước khi triển khai vào hệ thống sản xuất.


3

Đây là cách đơn giản nhất để đến đó:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

sản lượng: 10.987.655,88

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.