จะตั้งค่าตัวคั่นหลักพันใน Java ได้อย่างไร?


129

จะตั้งค่าตัวคั่นหลักพันใน Java ได้อย่างไร?
ฉันมีการแสดงสตริงของ BigDecimal ที่ฉันต้องการจัดรูปแบบด้วยตัวคั่นหลักพันและส่งคืนเป็น String


คุณได้รับค่าเหล่านี้จาก DB หรือไม่
Dead Programmer

คำตอบ:


110

สิ่งนี้ควรใช้งานได้ (ยังไม่ทดลองใช้ JavaDoc):

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

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

ตาม JavaDoc การส่งในบรรทัดแรกควรถูกบันทึกสำหรับโลแคลส่วนใหญ่


16
ความคิดเห็นที่ไม่ได้ทดสอบเกี่ยวกับสิ่งนี้: Javadoc สำหรับgetDecimalFormatSymbols()พูดว่า: Returns: a copy of the desired DecimalFormatSymbols. ดังนั้นคุณควรใช้setDecimalFormatSymbols(theCopy)หลังจากแก้ไขสำเนาแล้ว
java.is.for.desktop

6
เอกสารสำหรับ bd.longValue () ระบุว่า "ส่วนเศษส่วนใด ๆ จะถูกทิ้ง" ดังนั้นฉันไม่รู้ว่านี่เป็นวิธีที่ดีที่สุดถ้าคุณสนใจเรื่องความแม่นยำ
codinguser

2
ฉันเดาว่าคุณสามารถใช้newและตั้งค่ากลับเป็นฟอร์แมตเตอร์ได้: DecimalFormatSymbols customSymbol = new DecimalFormatSymbols(); customSymbol.setDecimalSeparator(decimalSeperator.charAt(0)); customSymbol.setGroupingSeparator(thousandSeperator); formatter.setDecimalFormatSymbols(customSymbol);
Lee Yi Hong

ฉันคิดว่าคุณคงต้องการใช้ \ u00a0 (พื้นที่ไม่ทำลาย) เป็นตัวคั่นการจัดกลุ่ม เป็นค่าเริ่มต้นสำหรับบางภาษา
ACV

3
ทำไมเรียก longValue คำถามคือการตั้งค่าตัวดำเนินการหลายพันตัวสำหรับ BigDecimal ไม่นาน
FINDarkside

232

คุณสามารถใช้ฟังก์ชัน format กับ ",";

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

//str = 124,750

"," ประกอบด้วยอักขระการจัดกลุ่มเฉพาะภาษา

เอกสาร


11
จะทำอย่างไรหากฉันต้องการใช้.เป็นตัวคั่น
Enissay

ตามปกติแล้วฉันจะใช้ String.format ดีที่สุดและง่ายที่สุดสำหรับฉัน!
อาลี

17
@Enissay สอบถามformat()กับสถานที่เกิดเหตุอย่างชัดเจน ( Local.USเป็นที่รู้จักกันที่จะใช้,เป็นตัวคั่น) แล้วแทนที่ด้วยคั่นกำหนดเองของคุณ:, String.format(Locale.US, "%,d", n).replace(',', '.')
minipif

java.util.IllegalFormatConversionException:% d ไม่สามารถจัดรูปแบบอาร์กิวเมนต์ java.lang.String
Iman Marashi

1
@ImanMarashi หล่อให้int. หรือกlong. หรือกBigInteger. และการใช้ฉถ้าคุณต้องการที่จะใช้double, หรือfloat BigDecimal
Adowrath

57
BigDecimal bd = new BigDecimal(300000);

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

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

แก้ไข

หากต้องการรับตัวคั่นการจัดกลุ่มที่กำหนดเองเช่นช่องว่างให้ทำสิ่งนี้:

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

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

ฉันรู้ว่าฉันจำเป็นต้องใช้ DecimalFormatSymbols setGroupingSeparator แต่ฉันไม่รู้ว่าจะใช้กับ BigDecimal
Funtime

1
@Funtime: คุณไม่ "นำไปใช้กับ BigDecimal ของคุณ" คุณสร้างNumberFormatวัตถุที่มีคุณสมบัติที่ต้องการและใช้สิ่งนั้นเพื่อจัดรูปแบบไฟล์BigDecimal. A มีBigDecimalเฉพาะค่าที่ระบุไม่มีรูปแบบที่ระบุ
Joachim Sauer

1
โปรดทราบว่าตัวคั่นหลักพันโดยทั่วไปเป็นช่องว่างที่ไม่ทำลาย (เมื่อเป็นช่องว่าง)
cquezel

ต้องเปลี่ยนบรรทัดบนสุดในตัวเลือกที่ 2 เป็นสัญลักษณ์ DecimalFormatSymbols = DecimalFormatSymbols ใหม่ (); สำหรับสิ่งนี้ในการทำงาน
PaperThick

14

ลองใช้รหัสนี้เพื่อจัดรูปแบบตามที่ใช้ในบราซิล:

    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
คุณลองทำเช่นนี้เช่นกันในกรณีของ JasperReports บังคับให้รูปแบบถูกต้อง: parameters.put("REPORT_LOCALE", new Locale("pt", "BR")); ส่งพารามิเตอร์นี้ไปยังรายงาน
dellasavia

8

หากคุณกำลังใช้ตัวคั่นพันสำหรับชนิดข้อมูลจำนวนเต็มให้ใช้ 1.

  1. สำหรับชนิดข้อมูลจำนวนเต็ม

String.format ("%, d \ n", 58625) และเอาต์พุตจะเป็น58,625

  1. สำหรับข้อมูล Floating Point ประเภท String.format ("% ,. 2f", 58625.21) และเอาต์พุตจะเป็น58,625.21

นี่คือความศักดิ์สิทธิ์ อย่างไรก็ตามคุณต้องเน้นว่า "," เป็นเพียงแฟล็กเท่านั้นไม่ใช่อักขระที่ใช้เป็นตัวคั่นกลุ่ม (ใช้เวลาพอสมควรในการค้นหาปัญหา) ดูdocs.oracle.com/javase/7/docs/api/java/util/Formatter.html
Vankog



3

คำตอบที่ได้รับการยอมรับจะต้องมีการเปลี่ยนแปลงจริง ๆ มิฉะนั้นจะไม่ทำงาน getDecimalFormatSymbolsทำสำเนาการป้องกัน ดังนั้น

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

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

บรรทัดใหม่คือformatter.setDecimalFormatSymbols (สัญลักษณ์);


2

สำหรับทศนิยม :

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

ดังที่ได้กล่าวไว้ข้างต้นลิงก์ต่อไปนี้จะให้รหัสประเทศที่เฉพาะเจาะจงเพื่อให้ Java สามารถแปลหมายเลขได้ ทุกประเทศมีสไตล์ของตัวเอง

ในลิงค์ด้านบนคุณจะพบรหัสประเทศซึ่งควรใส่ไว้ที่นี่:

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

ตัวอย่างเช่นสวิตเซอร์แลนด์จัดรูปแบบตัวเลขดังนี้:

1,000.00 -> 1'000.00 น

รหัสประเทศ

เพื่อให้บรรลุสิ่งนี้รหัสต่อไปนี้ใช้ได้กับฉัน:

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

ผลลัพธ์เป็นไปตามคาด:

1'000.00

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

formatStr(2524.2) // 2,254.20



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