Làm cách nào để thiết lập hàng nghìn dấu phân cách trong Java?


129

Làm cách nào để thiết lập hàng nghìn dấu phân cách trong Java?
Tôi có đại diện Chuỗi của BigDecimal mà tôi muốn định dạng bằng dấu phân cách hàng nghìn và trả về dưới dạng Chuỗi.


bạn có nhận được những giá trị này từ DB không?
Lập trình viên đã chết vào

Câu trả lời:


110

Điều này sẽ hoạt động (chưa được kiểm tra, dựa trên JavaDoc):

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Theo JavaDoc, các diễn viên trong dòng đầu tiên nên được lưu cho hầu hết các địa phương.


16
Nhận xét chưa được kiểm tra về điều này: Javadoc cho getDecimalFormatSymbols()biết : Returns: a copy of the desired DecimalFormatSymbols. Vì vậy, bạn nên sử dụng setDecimalFormatSymbols(theCopy)sau khi thay đổi bản sao.
java.is.for.desktop

6
Các tài liệu cho bd.longValue () nói rằng "bất kỳ phần phân số nào cũng sẽ bị loại bỏ". Vì vậy, tôi không biết liệu đây có phải là cách tốt nhất để làm điều này hay không nếu bạn quan tâm đến độ chính xác
viết mã

2
Tôi đoán bạn có thể sử dụng newvà đặt nó trở lại định dạng: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong

Tôi nghĩ rằng bạn sẽ muốn sử dụng \ u00a0 (không gian không phá vỡ) làm dấu tách nhóm. Nó là mặc định cho một số địa phương.
ACV

3
Tại sao bạn gọi longValue? Câu hỏi là đặt hàng nghìn toán tử cho BigDecimal, không lâu.
FINDarkside

232

Bạn có thể sử dụng chức năng định dạng với ",";

int no = 124750;
String str = String.format("%,d", no);

//str = 124,750

"," Bao gồm các ký tự nhóm cụ thể theo miền địa phương.

tài liệu


11
Nếu tôi muốn sử dụng .một dấu phân cách thì sao?
Enissay

Vì tôi thường sử dụng String.format, đây là cách tốt nhất và dễ nhất đối với tôi!
Ali

16
@Enissay Gọi format()với một miền địa phương rõ ràng ( Local.USđược biết là sử dụng ,như một dấu phân cách) và sau đó thay thế ,bằng dấu tách tùy chỉnh của bạn : String.format(Locale.US, "%,d", n).replace(',', '.').
minipif

java.util.IllegalFormatConversionException:% d không thể định dạng java.lang.String argument
Iman Marashi

1
@ImanMarashi Đúc nó thành một int. Hoặc a long. Hoặc a BigInteger. Và sử dụng f nếu bạn muốn sử dụng double, floathoặc BigDecimal.
Adowrath

56
BigDecimal bd = new BigDecimal(300000);

NumberFormat formatter = NumberFormat.getInstance(new Locale("en_US"));

System.out.println(formatter.format(bd.longValue()));

BIÊN TẬP

Để có được phân tách nhóm tùy chỉnh như không gian, hãy làm điều này:

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setGroupingSeparator(' ');

DecimalFormat formatter = new DecimalFormat("###,###.##", symbols);
System.out.println(formatter.format(bd.longValue()));

tôi biết tôi cần sử dụng DecimalFormatSymbols setGroupingSpayator, nhưng tôi không biết cách áp dụng nó trên BigDecimal của tôi
FOUND

1
@F.78: bạn không "áp dụng nó trên BigDecimal của bạn". Bạn xây dựng một NumberFormatđối tượng với các thuộc tính mong muốn và sử dụng nó để định dạng của bạn BigDecimal. A BigDecimalchỉ có một giá trị được chỉ định, nó không có định dạng cụ thể.
Joachim Sauer

1
Lưu ý rằng dải phân cách hàng ngàn nói chung là không gian không phá vỡ (khi đó là khoảng
trắng

Phải thay đổi dòng trên cùng trong tùy chọn thứ 2 thành DecimalFormatSymbolsbols = new DecimalFormatSymbols (); để làm việc này
PaperThick 14/03/13

14

thử mã này để định dạng như được sử dụng ở Brazil:

    DecimalFormat df = new DecimalFormat(
      "#,##0.00", 
      new DecimalFormatSymbols(new Locale("pt", "BR")));

    BigDecimal value = new BigDecimal(123456.00);

    System.out.println(df.format(value.floatValue()));

    // results: "123.456,00"

2
Bạn cũng thử điều này, trong trường hợp của JasperReports, buộc định dạng đúng: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); Gửi tham số này để báo cáo.
dellasavia

8

Nếu bạn đang sử dụng dấu phân cách nghìn cho kiểu dữ liệu Integer, hãy sử dụng 1.

  1. Đối với kiểu dữ liệu số nguyên

String.format ("%, d \ n", 58625) và đầu ra sẽ là 58.625

  1. Đối với kiểu dữ liệu dấu phẩy động String.format ("%, 2f", 58625,21) và đầu ra sẽ là 58,625,21

Đây là một bản hùng ca. Tuy nhiên, bạn thực sự phải nhấn mạnh rằng "," chỉ là một lá cờ, không phải là ký tự mà nó sử dụng như một dấu tách nhóm. (Mất một thời gian để tôi tìm ra vấn đề.) Xem docs.oracle.com/javase/7/docs/api/java/util/Formatter.html
Vankog

5
DecimalFormatSymbols formatSymbols = new DecimalFormatSymbols();
formatSymbols.setDecimalSeparator('|');
formatSymbols.setGroupingSeparator(' ');

String strange = "#,##0.###";
DecimalFormat df = new DecimalFormat(strange, formatSymbols);
df.setGroupingSize(4);

String out = df.format(new BigDecimal(300000).doubleValue());

System.out.println(out);

4
NumberFormat nf = DecimalFormat.getInstance(myLocale);
DecimalFormatSymbols customSymbol = new DecimalFormatSymbols();
customSymbol.setDecimalSeparator(',');
customSymbol.setGroupingSeparator(' ');
((DecimalFormat)nf).setDecimalFormatSymbols(customSymbol);
nf.setGroupingUsed(true);

3

Câu trả lời được chấp nhận phải được thực sự thay đổi nếu không không hoạt động. Các getDecimalFormatSymbols tạo một bản sao phòng thủ. Như vậy

DecimalFormat formatter = (DecimalFormat) NumberFormat.getInstance(Locale.US);
DecimalFormatSymbols symbols = formatter.getDecimalFormatSymbols();

symbols.setGroupingSeparator(' ');
formatter.setDecimalFormatSymbols(symbols);
System.out.println(formatter.format(bd.longValue()));

Dòng mới là dòng này: formatter.setDecimalFormatSymbols (ký hiệu);


2

Đối với số thập phân :

DecimalFormatSymbols symbols = new DecimalFormatSymbols();
symbols.setGroupingSeparator(' ');
DecimalFormat dfDecimal = new DecimalFormat("###########0.00###");
dfDecimal.setDecimalFormatSymbols(symbols);
dfDecimal.setGroupingSize(3);
dfDecimal.setGroupingUsed(true);
System.out.println(dfDecimal.format(number));

1

Như đã đề cập ở trên, liên kết sau cung cấp cho bạn mã quốc gia cụ thể để cho phép Java bản địa hóa số. Mỗi quốc gia có phong cách riêng của mình.

Trong liên kết ở trên, bạn sẽ tìm thấy mã quốc gia nên được đặt ở đây:

...(new Locale(<COUNTRY CODE HERE>));

Thụy Sĩ ví dụ định dạng các số như sau:

1000,00 -> 1'000,00

mã quốc gia

Để đạt được điều này, các sau hoạt động với tôi:

NumberFormat nf = NumberFormat.getNumberInstance(new Locale("de","CH"));
nf.setMaximumFractionDigits(2);
DecimalFormat df = (DecimalFormat)nf;
System.out.println(df.format(1000.00));

Kết quả như mong đợi:

1'000.00

1
public String formatStr(float val) {
 return String.format(Locale.CANADA, "%,.2f", val);
}

formatStr(2524.2) // 2,254.20



Mặc dù mã này có thể cung cấp một giải pháp cho câu hỏi, tốt hơn là thêm ngữ cảnh vào lý do tại sao / cách thức hoạt động của nó. Điều này có thể giúp người dùng trong tương lai tìm hiểu và áp dụng kiến ​​thức đó vào mã của riêng họ. Bạn cũng có thể có phản hồi tích cực từ người dùng dưới dạng upvote, khi mã được giải thích.
borchvm
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.