การจัดรูปแบบทศนิยมสองเท่าใน Java


118

ฉันมีปัญหาบางอย่างในการจัดรูปแบบทศนิยมของคู่ ถ้าฉันมีค่าสองเท่าเช่น 4.0 ฉันจะจัดรูปแบบทศนิยมให้เป็น 4.00 แทนได้อย่างไร


ลองใช้String.format()หรือjava.text.Format.
Code-Apprentice


คำตอบ:


218

หนึ่งในวิธีการที่จะใช้NumberFormat

NumberFormat formatter = new DecimalFormat("#0.00");     
System.out.println(formatter.format(4.0));

เอาท์พุท:

4.00


1
ใช่ แต่ฉันไม่ต้องการจุลภาคฉันต้องการเครื่องหมายทศนิยม
Christoffer

ฉันได้รับเครื่องหมายจุลภาค นี่คือสิ่งที่ฉันทำ "ตัวแปรคู่รูปแบบ NumberFormat = DecimalFormat ใหม่ (" # 0.00 "); System.out.println (formatter.format (ตัวแปร));
Christoffer

การส่งออกที่เป็น X, 00 และไม่ X.00
Christoffer

9
คุณได้รับเครื่องหมายจุลภาคเนื่องจากภาษาเริ่มต้นที่ JVM ของคุณใช้ซึ่งอาจแตกต่างจากภาษา Nambari ดูที่ NumberFormat javadoc: docs.oracle.com/javase/1.4.2/docs/api/java/text/…
Michael Zilbermann

1
ตามที่ zim2001 ชี้ไปภาษาของคุณอาจแตกต่างออกไป อ่านลิงค์ที่ให้ไว้ในคำตอบของฉัน ในตอนท้ายคุณจะพบข้อมูลเกี่ยวกับเรื่องนี้
kosa

73

ด้วย Java 8 คุณสามารถใช้formatmethod .. : -

System.out.format("%.2f", 4.0); // OR

System.out.printf("%.2f", 4.0); 
  • fใช้สำหรับfloatingแต้ม ..
  • 2 หลังทศนิยมหมายถึงจำนวนตำแหน่งทศนิยมหลัง .

สำหรับเวอร์ชัน Java ส่วนใหญ่คุณสามารถใช้DecimalFormat: -

    DecimalFormat formatter = new DecimalFormat("#0.00");
    double d = 4.0;
    System.out.println(formatter.format(d));

43

ใช้String.format :

String.format("%.2f", 4.52135);

ตามเอกสาร:

Locale.getDefault()สถานที่ใช้มักจะเป็นหนึ่งที่ส่งกลับโดย


8
String.format ยังยอมรับโลแคลเป็นพารามิเตอร์แรกสำหรับการจัดรูปแบบเครื่องหมายทศนิยม
Vincent Mimoun-Prat

4
เพื่อหลีกเลี่ยงเครื่องหมายทศนิยมเฉพาะตำแหน่ง (เช่นลูกน้ำ) ให้ระบุตำแหน่งที่ตั้งของสหรัฐอเมริกา: String.format (Locale.US, "%. 2f", 4.52135);
Alexander233

3
ฉันจะบอกว่า "การใช้จุดเฉพาะสถานที่ของสหรัฐอเมริกาเป็นเครื่องหมายทศนิยมระบุตำแหน่งที่ตั้งของสหรัฐอเมริกา" .. ความคิดที่ว่านิสัยของสหรัฐฯเป็นสิ่งที่ถูกต้องและอย่างอื่นก็เป็นสิ่งที่ "ชาวบ้าน" ทำให้ฉันคลั่งไคล้
Simone Gianni

@SimoneGianni อย่าตั้งสมมติฐานโง่ ๆ บางคนอาจต้องการทศนิยมให้เป็นจุด ตัวอย่างเช่นฉันกำลังเขียนฟังก์ชันที่ส่งออกเอกสาร CSV และฉันไม่สามารถใช้ลูกน้ำได้เนื่องจากอักขระลูกน้ำเป็นตัวคั่น
Kaiser Keister

19

โดยใช้ String.format คุณสามารถทำได้:

double price = 52000;
String.format("$%,.2f", price);

สังเกตลูกน้ำซึ่งทำให้สิ่งนี้แตกต่างจากคำตอบของ @ Vincent

เอาท์พุท:

$52,000.00

แหล่งข้อมูลที่ดีสำหรับการจัดรูปแบบคือหน้าจาวาอย่างเป็นทางการในหัวข้อนี้


6

คุณสามารถใช้วิธีการแบบคงที่ได้เสมอprintf from System.outจากนั้นคุณจะใช้ฟอร์แมตเตอร์ที่เกี่ยวข้อง สิ่งนี้ช่วยประหยัดพื้นที่ฮีปซึ่งตัวอย่างอื่น ๆ ที่คุณต้องทำ

Ex:

System.out.format("%.4f %n", 4.0); 

System.out.printf("%.2f %n", 4.0); 

ประหยัดพื้นที่ฮีปซึ่งเป็นโบนัสที่ค่อนข้างใหญ่ แต่ฉันมีความเห็นว่าตัวอย่างนี้สามารถจัดการได้ดีกว่าคำตอบอื่น ๆ โดยเฉพาะอย่างยิ่งเนื่องจากโปรแกรมเมอร์ส่วนใหญ่รู้จักฟังก์ชัน printf จาก C (Java เปลี่ยนฟังก์ชัน / วิธีการเล็กน้อย)


1
@Baz ฉันขาดรายละเอียดที่สำคัญที่นี่ไม่มี printStream กล่าวถึง OP กำลังขอความช่วยเหลือในการจัดรูปแบบ (ซึ่งสามารถแก้ไขได้ง่ายขึ้นโดยดูที่เอกสาร Java) ไปยังสตรีมเอาต์พุตมาตรฐาน อธิบาย.
Lewis Robbins

ความผิดฉันเอง. กำลังดูเวอร์ชัน javadoc ที่ไม่ถูกต้อง (1.4) BTW: outคือPrintStream.
Baz

@ บาสไร้กังวล. ใช่ฉันคิดว่าเป็นคลาสที่คุณอ้างถึงในหนังสือทุกเล่มของฉัน printf เรียกว่าวิธีการคงที่จาก System.out (เนื่องจากวิธีการเหล่านั้นเป็นแบบคงที่)
Lewis Robbins

1
เป็นที่แน่นอนเป็นวิธีที่คงที่ของprintf PrintStreamดูที่นี่ ;) แต่ยังคง +1
Baz

@Baz จากเอกสารคลาส printStream สืบทอด System.out ฉันอาจจะคิดผิด - แม้ว่ามันจะค่อนข้างแปลกที่จะสืบทอดวิธีการคงที่ (เป็นไปได้ไหม) คุณฉันคาดหวังว่าจะถูกต้อง
Lewis Robbins



1

อีกวิธีหนึ่งคือใช้setMinimumFractionDigitsวิธีการจากNumberFormatคลาส

โดยพื้นฐานแล้วคุณจะระบุจำนวนตัวเลขที่คุณต้องการให้ปรากฏหลังจุดทศนิยม

ดังนั้นอินพุตของ4.0จะให้ผล4.00สมมติว่าจำนวนที่คุณระบุคือ 2

แต่ถ้าข้อมูลของคุณDoubleมีมากกว่าจำนวนที่ระบุก็จะใช้จำนวนขั้นต่ำที่ระบุไว้จากนั้นเพิ่มอีกหนึ่งหลักที่ปัดขึ้น / ลง

ตัวอย่างเช่น4.15465454ด้วยจำนวนขั้นต่ำ 2 ที่ระบุไว้จะได้ผลผลิต4.155

NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
Double myVal = 4.15465454;
System.out.println(nf.format(myVal));

ลองออนไลน์


1

มีหลายวิธีที่คุณสามารถทำได้ สิ่งเหล่านี้ได้รับการร้อง:

สมมติว่าหมายเลขเดิมของคุณได้รับการร้อง:

 double number = 2354548.235;

ใช้ NumberFormat:

NumberFormat formatter = new DecimalFormat("#0.00");
    System.out.println(formatter.format(number));

ใช้ String.format:

System.out.println(String.format("%,.2f", number));

ใช้ DecimalFormat และรูปแบบ:

NumberFormat nf = DecimalFormat.getInstance(Locale.ENGLISH);
        DecimalFormat decimalFormatter = (DecimalFormat) nf;
        decimalFormatter.applyPattern("#,###,###.##");
        String fString = decimalFormatter.format(number);
        System.out.println(fString);

ใช้ DecimalFormat และ pattern

DecimalFormat decimalFormat = new DecimalFormat("############.##");
        BigDecimal formattedOutput = new BigDecimal(decimalFormat.format(number));
        System.out.println(formattedOutput);

ในทุกกรณีผลลัพธ์จะเป็น: 2354548.23

หมายเหตุ :

ในระหว่างการปัดเศษคุณสามารถเพิ่มRoundingModeในฟอร์แมตเตอร์ของคุณได้ นี่คือโหมดการปัดเศษบางส่วนที่ได้รับการร้อง:

    decimalFormat.setRoundingMode(RoundingMode.CEILING);
    decimalFormat.setRoundingMode(RoundingMode.FLOOR);
    decimalFormat.setRoundingMode(RoundingMode.HALF_DOWN);
    decimalFormat.setRoundingMode(RoundingMode.HALF_UP);
    decimalFormat.setRoundingMode(RoundingMode.UP);

นี่คือการนำเข้า :

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.text.DecimalFormat;
import java.text.NumberFormat;
import java.util.Locale;

1

คุณสามารถใช้วิธีใดวิธีหนึ่งด้านล่างนี้

  1. หากคุณกำลังใช้ java.text.DecimalFormat

    DecimalFormat decimalFormat = NumberFormat.getCurrencyInstance(); 
    decimalFormat.setMinimumFractionDigits(2); 
    System.out.println(decimalFormat.format(4.0));

    หรือ

    DecimalFormat decimalFormat =  new DecimalFormat("#0.00"); 
    System.out.println(decimalFormat.format(4.0)); 
  2. หากคุณต้องการแปลงเป็นรูปแบบสตริงธรรมดา

    System.out.println(String.format("%.2f", 4.0)); 

รหัสทั้งหมดข้างต้นจะพิมพ์4.00


0

ทำงานได้ 100%

import java.text.DecimalFormat;

public class Formatting {

    public static void main(String[] args) {
        double value = 22.2323242434342;
        // or  value = Math.round(value*100) / 100.0;

        System.out.println("this is before formatting: "+value);
        DecimalFormat df = new DecimalFormat("####0.00");

        System.out.println("Value: " + df.format(value));
    }

}

-3

NumberFormatก่อนนำเข้า จากนั้นเพิ่มสิ่งนี้:

NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

ซึ่งจะให้ทศนิยม 2 ตำแหน่งและใส่เครื่องหมายดอลลาร์หากเกี่ยวข้องกับสกุลเงิน

import java.text.NumberFormat;
public class Payroll 
{
    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) 
    {
    int hoursWorked = 80;
    double hourlyPay = 15.52;

    double grossPay = hoursWorked * hourlyPay;
    NumberFormat currencyFormatter = NumberFormat.getCurrencyInstance();

    System.out.println("Your gross pay is " + currencyFormatter.format(grossPay));
    }

}

1
คำถามไม่ได้เกี่ยวกับการแสดงสกุลเงินและได้รับคำตอบที่ถูกต้องมากขึ้นโดยใช้ฟังก์ชันการจัดรูปแบบ) เหมือนที่อธิบายไว้ในคำตอบอื่น ๆ )
yacc

-4

คุณสามารถทำได้ดังนี้:

double d = 4.0;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));

1
ใช้งานไม่ได้เพราะใช้##แทน00
Joaquin Iurchuk

-4

ฉันรู้ว่านี่เป็นหัวข้อเก่า แต่ถ้าคุณต้องการให้จุดแทนเครื่องหมายจุลภาคเพียงแค่บันทึกผลลัพธ์ของคุณเป็น X, 00 ลงในสตริงจากนั้นเพียงแค่เปลี่ยนเป็นช่วงเวลาเพื่อให้คุณได้รับ X.00

วิธีที่ง่ายที่สุดคือใช้การแทนที่

String var = "X,00";
String newVar = var.replace(",",".");

ผลลัพธ์จะเป็นX.00 ที่คุณต้องการ นอกจากนี้เพื่อให้ง่ายคุณสามารถทำได้ทั้งหมดในครั้งเดียวและบันทึกลงในตัวแปรคู่

Double var = Double.parseDouble(("X,00").replace(",",".");

ฉันรู้ว่าคำตอบนี้ไม่มีประโยชน์ในตอนนี้ แต่บางทีคนที่ตรวจสอบฟอรัมนี้อาจกำลังมองหาวิธีแก้ปัญหาอย่างรวดเร็วเช่นนี้

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