ฉันจะจัดรูปแบบหมายเลข String ให้มีเครื่องหมายจุลภาคและปัดเศษได้อย่างไร


142

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

String number = "1000500000.574" //assume my value will always be a String

ฉันต้องการให้เป็นสตริงที่มีค่า: 1,000,500,000.57

ฉันจะจัดรูปแบบเป็นเช่นนี้ได้อย่างไร

คำตอบ:


256

คุณอาจต้องการดูDecimalFormatชั้นเรียน สนับสนุนสถานที่ต่าง ๆ (เช่น: ในบางประเทศที่จะได้รับการจัดรูปแบบ1.000.500.000,57แทน)

คุณต้องแปลงสตริงนั้นเป็นตัวเลขซึ่งสามารถทำได้ด้วย:

double amount = Double.parseDouble(number);

ตัวอย่างโค้ด:

String number = "1000500000.574";
double amount = Double.parseDouble(number);
DecimalFormat formatter = new DecimalFormat("#,###.00");

System.out.println(formatter.format(amount));

คุณสามารถแสดงตัวอย่างของวิธีที่ฉันสามารถใช้ NumberFormat กับกรณีนี้โดยเฉพาะ?
Sheehan Alam

1
คุณยังสามารถใช้วิธีแก้ปัญหาด้านล่าง - สตริงคงที่สาธารณะ getRoundOffValue (ค่าคู่) {DecimalFormat df = ใหม่ DecimalFormat ("##, ##, ##, ##, ##, 0.00"); ส่งกลับ df.format (ค่า); }
Jitendra Nath

ฉันยังชอบศูนย์ก่อนจุดเช่น DecimalFormat formatter = new DecimalFormat ("#, ## 0.00"); - รับ. 0000 สำหรับศูนย์ฟังดูผิดสำหรับฉัน
Leo

45

สิ่งนี้สามารถทำได้โดยใช้ String.format () ซึ่งอาจจะง่ายกว่าและ / หรือยืดหยุ่นกว่าถ้าคุณกำลังจัดรูปแบบตัวเลขจำนวนมากในสตริงเดียว

    String number = "1000500000.574";
    Double numParsed = Double.parseDouble(number);

    System.out.println(String.format("The input number is: %,.2f", numParsed));
    // Or
    String numString = String.format("%,.2f", numParsed);

สำหรับสตริงรูปแบบ "% ,. 2f" - "," หมายถึงแยกกลุ่มตัวเลขด้วยเครื่องหมายจุลภาคและ ".2" หมายถึงสถานที่สองรอบหลังจากทศนิยม

สำหรับการอ้างอิงเกี่ยวกับตัวเลือกการจัดรูปแบบอื่น ๆ โปรดดูที่https://docs.oracle.com/javase/tutorial/java/data/numberformat.html


42

เมื่อคุณแปลงสตริงเป็นตัวเลขคุณสามารถใช้

// format the number for the default locale
NumberFormat.getInstance().format(num)

หรือ

// format the number for a particular locale
NumberFormat.getInstance(locale).format(num)

วิธีระบุทั้งโลแคลและปัดไปเป็น (ทศนิยม) 2 ทศนิยมได้อย่างไร
Jonik

6
อาใจไม่เคยพบว่า:new DecimalFormat("0.##", DecimalFormatSymbols.getInstance(locale))
Jonik

16

เนื่องจากนี่คือผลลัพธ์อันดับหนึ่งของ Google format number commas javaนี่คือคำตอบที่เหมาะสำหรับผู้ที่ทำงานกับตัวเลขทั้งหมดและไม่สนใจทศนิยม

String.format("%,d", 2000000)

เอาท์พุท:

2,000,000

ยังใช้งานได้กับการลอยเช่น printf ("%, f \ n", ทศนิยมจำนวน)
philwalk

12

ฉันสร้างยูทิลิตี้การจัดรูปแบบของฉันเอง ซึ่งรวดเร็วในการประมวลผลการจัดรูปแบบพร้อมกับคุณสมบัติมากมาย :)

มันรองรับ:

  • การจัดรูปแบบจุลภาคเช่น 1234567 กลายเป็น 1,234,567
  • คำนำหน้าด้วย "Thousand (K), Million (M), Billion (B), Trillion (T)"
  • ความแม่นยำของ 0 ถึง 15
  • การปรับขนาดใหม่ให้มีความแม่นยำ (หมายถึงถ้าคุณต้องการความแม่นยำ 6 หลัก แต่มีเพียง 3 หลักที่พร้อมใช้งานซึ่งบังคับให้ 3)
  • การลดส่วนนำหน้า (หมายถึงถ้าส่วนนำหน้าที่คุณเลือกนั้นใหญ่เกินไปก็จะลดลงไปเป็นส่วนนำหน้าที่เหมาะสมกว่า)

รหัสที่สามารถพบได้ที่นี่ คุณเรียกว่าแบบนี้:

public static void main(String[])
{
   int settings = ValueFormat.COMMAS | ValueFormat.PRECISION(2) | ValueFormat.MILLIONS;
   String formatted = ValueFormat.format(1234567, settings);
}

ฉันควรชี้ให้เห็นว่าสิ่งนี้ไม่รองรับการสนับสนุนทศนิยม แต่มีประโยชน์มากสำหรับค่าจำนวนเต็ม ตัวอย่างข้างต้นจะแสดง "1.23M" เป็นเอาต์พุต ฉันอาจจะเพิ่มการสนับสนุนทศนิยมบางที แต่ไม่เห็นใช้มากเกินไปสำหรับมันตั้งแต่นั้นมาฉันอาจรวมสิ่งนี้เข้ากับประเภท BigInteger ของคลาสที่จัดการอาร์เรย์ char [] ที่บีบอัดสำหรับการคำนวณทางคณิตศาสตร์


2
สิ่งนี้ดีถ้าคุณทำงานด้วยภาษาอังกฤษเท่านั้น คำแนะนำของฉันคือการหลีกเลี่ยงสิ่งที่มันโกรธอาหารค่ำของผู้ใช้ที่ไม่ใช่ภาษาอังกฤษของฉันเพราะพวกเขาไม่เข้าใจสิ่งที่KหรือMหมายถึง
rishabhmhjn

@rishabhmhjn แต่ ... คุณไม่สามารถปรับแต่งมันเพื่อปรับเปลี่ยนจดหมายที่คุณต้องการได้หรือไม่? โชคร้ายของคุณคือความผิดของเขาหรือไม่? : o และสิ่งที่เขาสร้างนั้นค่อนข้างเจ๋งแม้ลิงก์จะดูไม่พร้อมใช้งานในขณะนี้ ..
Aquarius Power

@AquariusPower ปัญหาคือเช่นตัวเลขญี่ปุ่นไม่เป็นไปตามระบบเมตริก ตัวเลขของพวกเขาคือ 1 百ต่อ 100, 1 千สำหรับ 1,000, 1 万สำหรับ 10,000 แล้วมันจะกลายเป็น 1 千万สำหรับ 1,000,0000 ทีมของฉันกำลังทำงานกับสิ่งที่คล้ายกันใน Javascript คุณสามารถใช้ตรรกะที่กล่าวถึงในนี้: github.com/statusbrew/angular-bignumber
rishabhmhjn

พบรหัสเก่าของฉันสำหรับเรื่องนี้ดังนั้นฉันจึงอัปโหลดใหม่ไปยัง GitHub ลิงค์ในความคิดเห็นได้รับการปรับปรุง
Jeremy Trifilo

6
public void convert(int s)
{
    System.out.println(NumberFormat.getNumberInstance(Locale.US).format(s));
}

public static void main(String args[])
{
    LocalEx n=new LocalEx();
    n.convert(10000);
}

6

คุณยังสามารถใช้วิธีแก้ปัญหาด้านล่าง -

public static String getRoundOffValue(double value){

        DecimalFormat df = new DecimalFormat("##,##,##,##,##,##,##0.00");
        return df.format(value);
}

4

คุณสามารถทำการแปลงทั้งหมดในหนึ่งบรรทัดโดยใช้รหัสต่อไปนี้:

String number = "1000500000.574";
String convertedString = new DecimalFormat("#,###.##").format(Double.parseDouble(number));

เครื่องหมาย # สองอันสุดท้ายในตัวสร้าง DecimalFormat สามารถเป็น 0 ได้เช่นกัน ทั้งสองวิธีใช้งานได้


3

คำตอบแรกใช้ได้ดีมาก แต่สำหรับ ZERO / 0 จะจัดรูปแบบเป็น. 00

ดังนั้นรูปแบบ #, ## 0.00 ทำงานได้ดีสำหรับฉัน ทดสอบตัวเลขที่แตกต่างกันเสมอเช่น 0/100 / 2334.30 และตัวเลขลบก่อนปรับใช้กับระบบการผลิต


3

นี่เป็นวิธีที่ง่ายที่สุดในการเดินทาง:

String number = "10987655.876";
double result = Double.parseDouble(number);
System.out.println(String.format("%,.2f",result)); 

ผลลัพธ์: 10,987,655.88

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