Làm cách nào để định dạng một số nguyên dài dưới dạng một chuỗi không có dấu phân cách trong Java?


122

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:


62

12
HoặcString.valueOf(long)
rsp 21/12/09

6
String.valueOf () gọi Long.toString ()
Peter Lawrey

7
Có thể điều này là vặt vãnh nhưng trong trường hợp này, bạn đang dựa vào hành vi không có giấy tờ của Long.toString (foo). Vì lý do đó, tôi thích câu trả lời của Daniel Fortunov hơn.
John K

4
Nó không phải là không có giấy tờ. Xem download.oracle.com/javase/6/docs/api/java/lang/… .
Rob H

3
Được, tuy nhiên giải pháp này không thể áp dụng cho định dạng thư trong ResourceBundle. Tuto i18n
Guillaume Husta

332
MessageFormat.format("{0,number,#}", foo);

1
Cảm ơn, tôi đã cố gắng thực hiện việc này bằng cách tiêm thuộc tính MessageFormat. Điều tốt là có nhiều cách để làm điều đó!
Philihp Busby vào

3
tôi thích cách này hơn. vì nó cho phép tôi thay đổi định dạng trong tệp thuộc tính ngôn ngữ của mình.
Pascal

2
Giải pháp hoàn hảo! Đã giúp tôi giữ tùy chọn định dạng / không định dạng trong dữ liệu tham chiếu thay vì ở cấp mã - cảm ơn! Và như @SebastianRoth đã nói - đây đáng lẽ phải là câu trả lời được chấp nhận.
Ofer Lando

9
Tôi thực sự ngạc nhiên tại sao prettying chuỗi số một mặc định và không phải là một điều rõ ràng với các định dạng API
humblerookie

1
Điều này cũng hoạt động bên trong một định dạng lựa chọn nếu bạn trích dẫn mẫu:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0

1

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.ChoiceFormatdà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 ChoiceFormatMessageFormatđ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. ChoiceFormatsử 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 1và 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 ChoiceFormatchuỗi, #cần phải được trích dẫn. Khi ChoiceFormathoà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.


0

Con đường ngắn nhất là

long foo = 12345;
String s = ""+foo;

3
Và, như mọi khi, điều này mở rộng đến new StringBuilder("").append(foo).toString()mức không thực sự tối ưu.
RAnders00

1
@ RAnders00 Chuyển đổi một số thành một chuỗi duy nhất dường như không phải là lựa chọn tối ưu nhất, tùy thuộc vào bối cảnh mà bạn thường có thể tránh nó hoàn toàn, nhưng đối với mô hình đơn giản nhất bạn có thể sử dụng""+
Peter Lawrey

1
Bạn đúng, nhưng tôi chỉ muốn chỉ ra vì mọi người luôn có xu hướng chỉ ra nó.
RAnders00

1
@ RAnders00 btw sử dụng định dạng thông báo là một thứ tự có độ lớn đắt hơn và phức tạp hơn trong trường hợp này.
Peter Lawrey

Yeah, một thay vì nên sử dụng Long.toString()vì nó là giải pháp điều này sử dụng ở chế độ nền anyways :)
RAnders00

-1

Là một giải pháp thay thế String.formatvà cũng java.util.Formattercó thể hiệu quả với bạn ...


-6

Bạn có thể thử:

String s = new Long(foo).toString();

8
Tạo đối tượng không cần thiết. Không bao giờ sử dụng mới với các lớp trình bao bọc.
keiki
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.