Force point (".") Sebagai pemisah desimal di java

103

Saat ini saya menggunakan kode berikut untuk mencetak ganda:

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

Ini berfungsi dengan baik, kecuali bahwa Java menggunakan pemisah desimal Lokal saya (koma) sementara saya ingin menggunakan titik. Adakah cara mudah untuk melakukan ini?

dtech
sumber
Jika Anda perlu menggunakan nilai ganda dengan desimal yang tepat, mungkin Anda harus menggunakan BigDecimal daripada double / Double. Lihat tautan ini untuk masalah yang mungkin Anda temui saat menggunakan variabel ganda. Anda juga dapat mencoba ini: System.out.println (5.1d + 1.1d); - hasilnya akan menjadi 6.199999999999999 bukan 6.2. Saya pikir seseorang yang mencari cara memformat angka dengan desimal sebagai String harus melewati variabel ganda.
razvanone

Jawaban:

172

Gunakan kelebihan String.formatyang memungkinkan Anda menentukan lokal:

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

Jika Anda hanya memformat angka - seperti Anda di sini - menggunakan NumberFormatmungkin akan lebih tepat. Tetapi jika Anda membutuhkan kemampuan pemformatan lainnya String.format, ini akan berfungsi dengan baik.

Jon Skeet
sumber
6
Locale.ROOT lebih netral.
speedogoo
@ speedogoo: Diedit, meskipun saya curiga untuk pemformatan angka, tidak ada bedanya.
Jon Skeet
1
Ya, tetapi Anda tidak perlu memilih antara AS dan Inggris. 😜
speedogoo
2
Locale.ROOT juga aman dari kemungkinan perubahan di masa mendatang dalam pilihan pemisah desimal suatu negara.
Attila Tanyi
IMO ini tidak menjawab pertanyaan tersebut, melainkan Locale.setDefault (New Locale ("en", "US")); lakukan seperti yang ditunjukkan dalam jawaban lain. Benar bahwa mungkin memiliki efek samping yang tidak diinginkan karena bersifat global, OTH sebagai pemrogram yang benar-benar saya inginkan adalah bahwa default globalnya adalah AS karena di tempat lain dalam kode saya di mana saya benar-benar peduli tentang lokal, saya melakukannya secara eksplisit.
nyholku
21

Solusi yang lebih drastis adalah menyetel Lokal Anda lebih awal di main ().

Suka:

Locale.setDefault(new Locale("en", "US"));
Federico Giorgi
sumber
11
Ini adalah jawaban yang sangat bermasalah, karena memiliki efek global, sehingga dapat menyebabkan banyak perubahan lain (yang mungkin tidak diinginkan).
sleske
2
IMO ini adalah jawaban yang benar untuk pertanyaan tersebut dan selain sebagai programmer, inilah yang saya inginkan. Saya ingin Java menggunakan lokal AS secara default karena di mana pun dalam kode saya di mana saya benar-benar membutuhkan pelokalan, saya akan membuatnya eksplisit dalam kode saya. Mungkin hanya kebiasaan saya tetapi sangat mengganggu ketika printf / format menggunakan Lokal saya menyebabkan kemudian desimal 'koma' sama sekali tidak kompatibel dengan perangkat lunak lain (Matlab ada) yang saya gunakan.
nyholku
10

Anda bisa meneruskan Lokal tambahan ke java.lang.String.format serta ke java.io.PrintStream.printf (misalnya 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);
    }

}

Ini menghasilkan yang berikut (di PC saya):

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

Lihat String.format di Java API.

Simon A. Eugster
sumber
4
Anda juga dapat menggunakan out.printf((Locale)null, ...)atau out.format((Locale)null, ...)untuk mendapatkan representasi independen lokal. (dan ada juga Locale.ROOT)
eckes
10

Terlambat tetapi seperti yang disebutkan lain di sini adalah penggunaan sampel NumberFormat(dan subkelasnya DecimalFormat)

public static String format(double num) {
    DecimalFormatSymbols decimalSymbols = DecimalFormatSymbols.getInstance();
    decimalSymbols.setDecimalSeparator('.');
    return new DecimalFormat("0.00", decimalSymbols).format(num);
 }
VizGhar
sumber
Saya merasa bahwa membuat DecimalFormatSymbolsdan mengatur pemisah harus dilakukan sekali, sebelum metode ini.
Jalur
0

Anda dapat menggunakan NumberFormat dan DecimalFormat.

Lihatlah tautan ini dari Java Tutorials LocaleSpecific Formatting

Bagian yang berjudul Pemformatan Sensitif-Lokal adalah yang Anda butuhkan.

blong824
sumber
-3

Saya memiliki masalah yang sama .. 55.1berubah menjadi 55,10. Perbaikan cepat saya (kotor?) Adalah:

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

fred '
sumber
1
Itu hanya berfungsi sampai seseorang mencoba menjalankan kode Anda di lokasi yang berbeda. Bukan solusi nyata. -1
Marco Freudenberger