Câu hỏi đơn giản, nhưng tôi cá rằng hỏi ở đây có lẽ sẽ dễ hiểu hơn là cố gắng hiểu tài liệu về MessageFormat
:
long foo = 12345;
String s = MessageFormat.format("{0}", foo);
Giá trị quan sát được là "12,345".
Giá trị mong muốn là "12345".
Câu hỏi đơn giản, nhưng tôi cá rằng hỏi ở đây có lẽ sẽ dễ hiểu hơn là cố gắng hiểu tài liệu về MessageFormat
:
long foo = 12345;
String s = MessageFormat.format("{0}", foo);
Giá trị quan sát được là "12,345".
Giá trị mong muốn là "12345".
Câu trả lời:
Chỉ dùng Long.toString(long foo)
MessageFormat.format("{0,number,#}", foo);
MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
Tôi đã vật lộn với điều này một chút khi cố gắng thực hiện các mẫu "thế giới thực" với quốc tế hóa, v.v. Cụ thể, chúng tôi cần sử dụng định dạng "lựa chọn" trong đó kết quả đầu ra phụ thuộc vào các giá trị được hiển thị và đó là những gì java.text.ChoiceFormat
dành cho.
Đây là một ví dụ về cách thực hiện điều này:
MessageFormat fmt = new MessageFormat("{0,choice,0#zero!|1#one!|1<{0,number,'#'}|10000<big: {0}}");
int[] nums = new int[] {
0,
1,
100,
1000,
10000,
100000,
1000000,
10000000
};
Object[] a = new Object[1];
for(int num : nums) {
a[0] = num;
System.out.println(fmt.format(a));
}
Điều này tạo ra kết quả sau; Tôi hy vọng nó hữu ích cho những người khác đang cố gắng hoàn thành những việc tương tự:
zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000
Như bạn có thể thấy, định dạng "lựa chọn" cho phép chúng ta chọn loại định dạng để sử dụng tùy thuộc vào giá trị được chuyển vào để định dạng. Các số nhỏ có thể được thay thế bằng văn bản (không hiển thị giá trị gốc). Các số cỡ trung bình được hiển thị không có dấu phân tách nhóm (không có dấu phẩy). Số lớn nhất bao gồm cả dấu phẩy, một lần nữa. Rõ ràng, đây là một ví dụ hoàn toàn giả tạo để chứng minh tính linh hoạt của java.text.MessageFormat
.
Lưu ý về đoạn trích dẫn #
trong văn bản định dạng: vì cả hai ChoiceFormat
và MessageFormat
đang được sử dụng, có sự va chạm giữa các siêu ký tự giữa hai ký tự này. ChoiceFormat
sử dụng #
như một siêu ký tự, về cơ bản có nghĩa là "bằng" để công cụ định dạng biết rằng ví dụ: trong trường hợp 1#one!
chúng ta đang so sánh{0}
với 1
và nếu chúng bằng nhau, nó sẽ sử dụng "lựa chọn" cụ thể đó.
Nhưng #
có một ý nghĩa khácMessageFormat
, và đó là một siêu ký tự có ý nghĩa DecimalFormat
: đó là một siêu ký tự có nghĩa là "đặt một số ở đây".
Bởi vì nó được bao bọc trong một ChoiceFormat
chuỗi, #
cần phải được trích dẫn. Khi ChoiceFormat
hoàn tất quá trình phân tích chuỗi, những dấu ngoặc kép đó sẽ bị xóa khi chuyển các định dạng con đếnMessageFormat
(và sau đó chuyển sang DecimalFormat
).
Vì vậy, khi bạn đang sử dụng {0,choice,...}
, bạn phải trích dẫn các #
ký tự đó, và có thể là những ký tự khác.
Con đường ngắn nhất là
long foo = 12345;
String s = ""+foo;
new StringBuilder("").append(foo).toString()
mức không thực sự tối ưu.
""+
Long.toString()
vì nó là giải pháp điều này sử dụng ở chế độ nền anyways :)
Là một giải pháp thay thế String.format
và cũng java.util.Formatter
có thể hiệu quả với bạn ...
String.valueOf(long)