ฉันจะจัดรูปแบบจำนวนเต็มที่ยาวเป็นสตริงโดยไม่มีตัวคั่นใน Java ได้อย่างไร


122

คำถามง่ายๆ แต่ฉันจะพนันได้เลยว่าการถามที่นี่น่าจะตรงไปตรงมามากกว่าการพยายามทำความเข้าใจเอกสารสำหรับMessageFormat:

long foo = 12345;
String s = MessageFormat.format("{0}", foo);

ค่าที่สังเกตได้คือ "12,345"

ค่าที่ต้องการคือ "12345"

คำตอบ:


62

เพียงแค่ใช้ Long.toString(long foo)


12
หรือString.valueOf(long)
rsp

6
String.valueOf () เรียก Long.toString ()
Peter Lawrey

7
บางทีนี่อาจเป็นเรื่องเล็กน้อย แต่ในกรณีนี้คุณต้องอาศัยพฤติกรรมที่ไม่มีเอกสารของ Long.toString (foo) ด้วยเหตุนี้ฉันจึงชอบคำตอบของ Daniel Fortunov
John K

4
มันไม่มีเอกสาร ดูdownload.oracle.com/javase/6/docs/api/java/lang/...
Rob H

3
ตกลงอย่างไรก็ตามโซลูชันนี้ใช้ไม่ได้กับการจัดรูปแบบข้อความใน ResourceBundle Tuto i18n
Guillaume Husta

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

1
ขอบคุณฉันพยายามทำสิ่งนี้ด้วยการฉีดคุณสมบัติ MessageFormat ของดีมีมากกว่าหนึ่งวิธี!
Philihp Busby

3
ฉันชอบวิธีนี้ เนื่องจากมันช่วยให้ฉันเปลี่ยนรูปแบบในไฟล์คุณสมบัติภาษาของฉัน
Pascal

2
โซลูชั่นที่สมบูรณ์แบบ! ช่วยฉันเก็บตัวเลือกรูปแบบ / ไม่จัดรูปแบบไว้ในข้อมูลอ้างอิงแทนที่จะอยู่ที่ระดับรหัส - ขอบคุณ! และตามที่ @SebastianRoth กล่าว - นี่ควรเป็นคำตอบที่ยอมรับได้
Ofer Lando

9
ฉันแปลกใจจริง ๆ ว่าทำไมสตริงตัวเลขจึงเป็นค่าเริ่มต้นและไม่ใช่สิ่งที่ชัดเจนกับ API ตัวจัดรูปแบบ
humblerookie

1
นอกจากนี้ยังใช้งานได้ในรูปแบบตัวเลือกหากคุณอ้างรูปแบบ:MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
GOTO 0

1

ฉันต่อสู้กับเรื่องนี้เล็กน้อยเมื่อพยายามทำรูปแบบ "โลกแห่งความจริง" ด้วยความเป็นสากล ฯลฯ โดยเฉพาะอย่างยิ่งเราจำเป็นต้องใช้รูปแบบ "ตัวเลือก" ซึ่งผลลัพธ์ขึ้นอยู่กับค่าที่แสดงและนั่นคือสิ่งที่ java.text.ChoiceFormatมีไว้เพื่อ

นี่คือตัวอย่างวิธีการทำสิ่งนี้:

    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));
    }

สิ่งนี้จะสร้างผลลัพธ์ต่อไปนี้ ฉันหวังว่ามันจะเป็นประโยชน์สำหรับคนอื่น ๆ ที่พยายามทำสิ่งเดียวกันให้สำเร็จ:

zero!
one!
100
1000
10000
big: 100,000
big: 1,000,000
big: 10,000,000

อย่างที่คุณเห็นรูปแบบ "ตัวเลือก" ช่วยให้เราสามารถเลือกประเภทของรูปแบบที่จะใช้ขึ้นอยู่กับค่าที่จะส่งผ่านในการจัดรูปแบบ ตัวเลขขนาดเล็กสามารถแทนที่ด้วยข้อความ (ไม่แสดงค่าดั้งเดิม) ตัวเลขขนาดกลางจะแสดงโดยไม่มีตัวคั่นการจัดกลุ่ม (ไม่มีเครื่องหมายจุลภาค) ตัวเลขที่ใหญ่ที่สุดจะรวมเครื่องหมายจุลภาคอีกครั้ง เห็นได้ชัดว่านี่เป็นตัวอย่างที่สร้างขึ้นทั้งหมดเพื่อแสดงให้เห็นถึงความยืดหยุ่นของjava.text.MessageFormatแน่นอนนี้เป็นตัวอย่างที่วางแผนไว้ทั้งหมดเพื่อแสดงให้เห็นถึงความยืดหยุ่นของ

หมายเหตุเกี่ยวกับข้อความที่ยกมา#ในรูปแบบข้อความ: เนื่องจากทั้งสองChoiceFormatและMessageFormatกำลังถูกใช้จึงมีการชนกันระหว่างอักขระเมตาระหว่างทั้งสอง ChoiceFormatใช้#เป็นอักขระเมตาซึ่งโดยพื้นฐานแล้วหมายถึง "เท่ากับ" เพื่อให้เอ็นจินการจัดรูปแบบรู้ว่าเช่นในกรณีที่1#one!เรากำลังเปรียบเทียบ{0}ด้วย1และหากมีค่าเท่ากันก็จะใช้ "ตัวเลือก" นั้น ๆ

แต่#มีความหมายอีกอย่างหนึ่งMessageFormatและนั่นก็คือ metacharacter ที่มีความหมายสำหรับDecimalFormat: มันคือ metacharacter ซึ่งหมายถึง "ใส่ตัวเลขที่นี่"

เนื่องจากมันรวมอยู่ในChoiceFormatสตริงจึง#จำเป็นต้องยกมา เมื่อChoiceFormatเสร็จสิ้นการแยกวิเคราะห์สตริงเครื่องหมายคำพูดเหล่านั้นจะถูกลบออกเมื่อส่งผ่านรูปแบบย่อยไปยังMessageFormat(และจากนั้นไปที่DecimalFormat)

ดังนั้นเมื่อคุณใช้{0,choice,...}คุณต้องอ้างถึง#อักขระเหล่านั้นและอาจเป็นไปได้อื่น ๆ


0

วิธีที่สั้นที่สุดคือ

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

3
และเช่นเคยสิ่งนี้ขยายออกไปnew StringBuilder("").append(foo).toString()จึงไม่เหมาะสมจริงๆ
RAnders00

1
@ RAnders00 การแปลงตัวเลขเป็นสตริงเดียวไม่น่าจะเป็นตัวเลือกที่เหมาะสมที่สุดทั้งนี้ขึ้นอยู่กับบริบทที่คุณสามารถหลีกเลี่ยงได้ทั้งหมด แต่สำหรับรูปแบบที่ง่ายที่สุดที่คุณสามารถใช้ได้""+
Peter Lawrey

1
คุณพูดถูก แต่ฉันแค่อยากจะชี้ให้เห็นเพราะคนมักจะชี้ให้เห็น
RAnders00

1
@ RAnders00 btw โดยใช้รูปแบบข้อความเป็นลำดับขนาดที่แพงกว่าและซับซ้อนกว่าในกรณีนี้
Peter Lawrey

ใช่ควรใช้แทนLong.toString()เนื่องจากเป็นสิ่งที่โซลูชันนี้ใช้ในพื้นหลัง :)
RAnders00


-6

คุณสามารถลอง:

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

8
การสร้างวัตถุที่ไม่จำเป็น อย่าใช้ใหม่กับคลาส Wrapper
keiki
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.