คำถามง่ายๆ แต่ฉันจะพนันได้เลยว่าการถามที่นี่น่าจะตรงไปตรงมามากกว่าการพยายามทำความเข้าใจเอกสารสำหรับMessageFormat
:
long foo = 12345;
String s = MessageFormat.format("{0}", foo);
ค่าที่สังเกตได้คือ "12,345"
ค่าที่ต้องการคือ "12345"
คำถามง่ายๆ แต่ฉันจะพนันได้เลยว่าการถามที่นี่น่าจะตรงไปตรงมามากกว่าการพยายามทำความเข้าใจเอกสารสำหรับMessageFormat
:
long foo = 12345;
String s = MessageFormat.format("{0}", foo);
ค่าที่สังเกตได้คือ "12,345"
ค่าที่ต้องการคือ "12345"
คำตอบ:
เพียงแค่ใช้ Long.toString(long foo)
MessageFormat.format("{0,number,#}", foo);
MessageFormat.format("{0,choice,0#no foos|1#one foo|1<'{0,number,#}' foos}"
ฉันต่อสู้กับเรื่องนี้เล็กน้อยเมื่อพยายามทำรูปแบบ "โลกแห่งความจริง" ด้วยความเป็นสากล ฯลฯ โดยเฉพาะอย่างยิ่งเราจำเป็นต้องใช้รูปแบบ "ตัวเลือก" ซึ่งผลลัพธ์ขึ้นอยู่กับค่าที่แสดงและนั่นคือสิ่งที่ 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,...}
คุณต้องอ้างถึง#
อักขระเหล่านั้นและอาจเป็นไปได้อื่น ๆ
วิธีที่สั้นที่สุดคือ
long foo = 12345;
String s = ""+foo;
new StringBuilder("").append(foo).toString()
จึงไม่เหมาะสมจริงๆ
""+
Long.toString()
เนื่องจากเป็นสิ่งที่โซลูชันนี้ใช้ในพื้นหลัง :)
เป็นอีกทางเลือกหนึ่งString.format
และjava.util.Formatter
อาจได้ผลสำหรับคุณเช่นกัน ...
คุณสามารถลอง:
String s = new Long(foo).toString();
String.valueOf(long)