Mengapa pola 33333.## bertingkah sangat aneh ketika kita menggunakan metode DecimalFormat .format()?

Kemarin saya mencoba mengeksplorasi sendiri perilaku metode DecimalFormat .format() dengan semua placeholdernya dan apa fungsinya.
Jadi saya menulis dua angka dan mencoba pola yang berbeda pada angka tersebut. Dengan "#.##" semua angka nol yang tidak signifikan dipotong dan dengan "0000.00" metode ini menambahkan angka nol di depan angka tersebut. Tidak apa-apa, tapi kemudian saya mencoba beberapa pola aneh hanya untuk melihat apa yang akan terjadi.
Dengan pola "33333.##" hasil akhirnya sungguh aneh. Anda dapat melihat kode saya di bawah ini:

DecimalFormat df = new DecimalFormat("33332.##");
double a= 222.46705219;
double b=-102.000;

System.out.println(df.format(a));
System.out.println(df.format(b));

Dan hasilnya adalah:

 33332222,47
-33332102,0   

Input yang sama dengan angka tetapi dengan pola yang digunakan "33033.##" memberikan hasil:

33222,4732
33102

Saya memahami bahwa program menambahkan angka yang diformat sebagai pengganti 0, tetapi mengapa ketika nol tidak disajikan sebagai pengganti, metode ini masih membulatkan angka pertama dan (tentu saja) angka kedua?
Mengapa angka pertama saya dibulatkan ke angka kedua digit sebagaimana mestinya, tetapi angka kedua (b) dicetak dengan angka nol di akhir?
Dan mengapa ketika placeholder 0 ditampilkan di tengah "33033.##" program menyisipkan angka yang diformat a pada tempatnya tetapi tidak mencetak "33" di akhir angka b?
Saya benar-benar tidak tahu bagaimana menjelaskan perilaku ini.


person Savina Dimitrova    schedule 30.09.2017    source sumber


Jawaban (1)


dokumentasi menyoroti sintaksis yang jelas untuk pola yang harus Anda atur. Kedua format Anda bertentangan dengan sintaksis yang disyaratkan, sehingga temuan Anda tidak akan dianggap dapat diandalkan, dan mungkin berubah di versi mendatang. Sejujurnya, saya terkejut karena konstruktor tidak memberikan pengecualian pada format ini.

33332.##: 33332 dipandang sebagai awalan, dan sisanya, .##, tidak valid karena 0 atau # harus diisi sebelum koma desimal.

33033.##: 33 dipandang sebagai awalan, menyisakan 033.##. Mengingat 0, ., atau # tidak dapat menjadi bagian dari awalan atau akhiran apa pun, dan 3 hanya dapat menjadi bagian dari awalan atau akhiran, pola ini tidak valid.

person Joe C    schedule 30.09.2017
comment
Ya, saya tahu itu tidak valid tetapi itu tidak menjelaskan mengapa setiap pola memperlakukan angka a dengan cara yang berbeda dari angka b. Lihat contohnya - mengapa pola 33332.## mencetak a diformat ke digit kedua setelah pemisah desimal, tetapi b diformat ke digit pertama? - person Savina Dimitrova; 30.09.2017
comment
Yang ingin saya sampaikan adalah, karena tidak valid, maka hasilnya tidak dapat diprediksi. Hal ini bisa terjadi karena sejumlah alasan, dan tidak ada alasan untuk percaya bahwa hal ini tidak akan berubah tanpa peringatan. - person Joe C; 30.09.2017