Force point (“.”) เป็นตัวคั่นทศนิยมใน java


105

ขณะนี้ฉันใช้รหัสต่อไปนี้เพื่อพิมพ์สองครั้ง:

return String.format("%.2f", someDouble);

ใช้งานได้ดียกเว้น Java ใช้ตัวคั่นทศนิยมของ Locale (ลูกน้ำ) ในขณะที่ฉันต้องการใช้จุด มีวิธีง่ายๆในการทำเช่นนี้หรือไม่?


หากคุณต้องการใช้ค่าสองเท่าที่มีทศนิยมที่แม่นยำคุณควรใช้ BigDecimal แทน double / Double ดูลิงก์นี้สำหรับปัญหาที่คุณอาจพบเมื่อใช้ตัวแปรคู่ คุณยังสามารถลองสิ่งนี้: System.out.println (5.1d + 1.1d); - ผลลัพธ์จะเป็น 6.199999999999999 แทนที่จะเป็น 6.2 ฉันคิดว่าใครบางคนที่กำลังมองหาวิธีจัดรูปแบบตัวเลขด้วยทศนิยมเป็น String ต้องข้ามตัวแปรคู่
razvanone

คำตอบ:


174

ใช้โอเวอร์โหลดString.formatซึ่งช่วยให้คุณระบุโลแคล:

return String.format(Locale.ROOT, "%.2f", someDouble);

หากคุณกำลังเพียงการจัดรูปแบบตัวเลข - ในขณะที่คุณอยู่ที่นี่ - แล้วใช้NumberFormatอาจจะเหมาะสมกว่า แต่ถ้าคุณต้องการความสามารถในการจัดรูปแบบที่เหลือString.formatก็น่าจะใช้ได้


6
Locale.ROOT เป็นกลางมากขึ้น
speedogoo

@speedogoo: แก้ไขแล้วแม้ว่าฉันสงสัยว่าการจัดรูปแบบตัวเลขมันไม่ได้สร้างความแตกต่างใด ๆ
Jon Skeet

1
ใช่ แต่คุณไม่จำเป็นต้องเลือกระหว่างสหรัฐอเมริกาและสหราชอาณาจักร 😜
speedogoo

2
Locale.ROOT ยังปลอดภัยจากการเปลี่ยนแปลงในอนาคตที่เป็นไปได้ในการเลือกตัวคั่นทศนิยมของประเทศ
Attila Tanyi

IMO นี้ไม่ตอบคำถาม แต่เป็น Locale.setDefault (สถานที่ใหม่ ("en", "US")); ทำตามที่ระบุไว้ในคำตอบอื่น จริงอยู่ที่อาจมีผลข้างเคียงที่ไม่พึงปรารถนาเนื่องจากเป็นทั่วโลก OTH ในฐานะโปรแกรมเมอร์สิ่งที่ฉันต้องการจริงๆคือค่าเริ่มต้นทั่วโลกคือสหรัฐอเมริกาเพราะที่อื่นในรหัสของฉันที่ฉันสนใจเกี่ยวกับสถานที่ที่ฉันทำอย่างชัดเจน
nyholku

21

วิธีแก้ปัญหาที่รุนแรงกว่านั้นคือการตั้งค่า Locale ของคุณในช่วง main ()

ชอบ:

Locale.setDefault(new Locale("en", "US"));

11
นี่เป็นคำตอบที่มีปัญหามากเนื่องจากมีผลกระทบทั่วโลกจึงอาจทำให้เกิดการเปลี่ยนแปลงอื่น ๆ (อาจไม่เป็นที่ต้องการ) มากมาย
sleske

2
IMO นี่คือคำตอบที่ถูกต้องสำหรับคำถามและข้างๆในฐานะโปรแกรมเมอร์นี่คือสิ่งที่ฉันต้องการ ฉันต้องการให้ Java ใช้ตำแหน่งที่ตั้งของสหรัฐอเมริกาโดยค่าเริ่มต้นทุกที่ในโค้ดของฉันที่ฉันต้องการการแปลเป็นภาษาท้องถิ่นฉันจะทำให้มันชัดเจนในโค้ดของฉัน อาจเป็นแค่นิสัยของฉัน แต่มันก็น่ารำคาญมากเมื่อ printf / format ใช้โลแคลในพื้นที่ของฉันดังนั้น 'ลูกน้ำ' ทศนิยมจะไม่เข้ากันกับซอฟต์แวร์อื่น ๆ (Matlab ทุกคน) ที่ฉันใช้
nyholku

10

คุณสามารถส่ง Locale เพิ่มเติมไปยัง java.lang.String.format เช่นเดียวกับ java.io.PrintStream.printf (เช่น System.out.printf ()):

import java.util.Locale;

public class PrintfLocales {

    public static void main(String args[]) {
        System.out.printf("%.2f: Default locale\n", 3.1415926535);
        System.out.printf(Locale.GERMANY, "%.2f: Germany locale\n", 3.1415926535);
        System.out.printf(Locale.US, "%.2f: US locale\n", 3.1415926535);
    }

}

ผลลัพธ์ดังต่อไปนี้ (บนพีซีของฉัน):

$ java PrintfLocales
3.14: Default locale
3,14: Germany locale
3.14: US locale

โปรดดูString.formatใน Java API


4
คุณยังสามารถใช้out.printf((Locale)null, ...)หรือout.format((Locale)null, ...)เพื่อรับการแสดงที่เป็นอิสระจากโลแคล (และยังมีLocale.ROOT)
เช่น

10

สายเกินไป แต่อย่างที่กล่าวถึงในที่นี้คือตัวอย่างการใช้งานNumberFormat(และคลาสย่อยDecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }

ฉันรู้สึกว่าการสร้างDecimalFormatSymbolsและตั้งค่าตัวคั่นควรทำครั้งเดียวก่อนวิธีนี้
สาย

0

คุณสามารถใช้ NumberFormat และ DecimalFormat

ลองดูลิงค์นี้จาก Java Tutorials LocaleSpecific Formatting

ส่วนที่มีชื่อว่า Locale-Sensitive Formatting คือสิ่งที่คุณต้องการ


-3

ฉันมีปัญหาเดียวกัน .. 55.1เปลี่ยนเป็น55,10. การแก้ไขอย่างรวดเร็ว (สกปรก?) ของฉันคือ:

String.format("%.2f", value).replaceAll(",",".");


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