1. Gambaran keseluruhan
Dalam tutorial ini, kita akan melihat pendekatan yang berbeza untuk pemformatan nombor di Java dan cara menerapkannya.
2. Pemformatan Nombor Asas dengan format String #
The String # format kaedah adalah sangat berguna untuk memformat nombor. Kaedahnya mengambil dua hujah. Argumen pertama menerangkan corak berapa banyak tempat perpuluhan yang ingin kita lihat, dan argumen kedua adalah nilai yang diberikan:
double value = 4.2352989244d; assertThat(String.format("%.2f", value)).isEqualTo("4.24"); assertThat(String.format("%.3f", value)).isEqualTo("4.235");
3. Pemformatan Perpuluhan dengan Pembundaran
Di Jawa, kami mempunyai dua jenis primitif yang mewakili nombor perpuluhan - terapung dan perpuluhan :
double myDouble = 7.8723d; float myFloat = 7.8723f;
Bilangan tempat perpuluhan boleh berbeza bergantung pada operasi yang dilakukan. Dalam kebanyakan kes, kami hanya berminat dengan tempat perpuluhan pertama. Mari kita lihat beberapa cara untuk memformat perpuluhan dengan pembundaran.
3.1. Menggunakan BigDecimal untuk Pemformatan Nombor
The BigDecimal kelas menyediakan kaedah ke pusingan ke nombor yang ditetapkan tempat perpuluhan. Mari buat kaedah penolong yang akan mengembalikan dua tempat, dibundarkan ke sejumlah tempat yang diinginkan:
public static double withBigDecimal(double value, int places) { BigDecimal bigDecimal = new BigDecimal(value); bigDecimal = bigDecimal.setScale(places, RoundingMode.HALF_UP); return bigDecimal.doubleValue(); }
Kami mulakan dengan contoh BigDecimal baru dengan nilai perpuluhan asal kami. Kemudian, dengan menetapkan skala, kami memberikan bilangan tempat perpuluhan yang kami mahukan dan bagaimana kami mahu membundarkan nombor kami . Menggunakan kaedah ini membolehkan kita memformat nilai ganda dengan mudah :
double D = 4.2352989244d; assertThat(withBigDecimal(D, 2)).isEqualTo(4.24); assertThat(withBigDecimal(D, 3)).isEqualTo(4.235);
3.2. Menggunakan Matematik # pusingan
Kita juga dapat memanfaatkan kaedah statik di kelas Matematik untuk membundarkan nilai berganda ke tempat perpuluhan yang ditentukan. Dalam kes ini, kita dapat menyesuaikan bilangan tempat perpuluhan dengan mengalikan dan kemudian membahagi dengan 10 ^ n . Mari periksa kaedah penolong kami:
public static double withMathRound(double value, int places) { double scale = Math.pow(10, places); return Math.round(value * scale) / scale; }
assertThat(withMathRound(D, 2)).isEqualTo(4.24); assertThat(withMathRound(D, 3)).isEqualTo(4.235);
Walau bagaimanapun, cara ini hanya disyorkan dalam kes tertentu kerana kadang-kadang output mungkin dibundarkan secara berbeza seperti yang diharapkan sebelum dicetak.
Ini kerana matematik # pusingan mengurangkan nilai . Mari lihat bagaimana ini boleh berlaku:
System.out.println(withMathRound(1000.0d, 17)); // Gives: 92.23372036854776 !! System.out.println(withMathRound(260.775d, 2)); // Gives: 260.77 instead of expected 260.78
Oleh itu, kaedah tersebut hanya disenaraikan untuk tujuan pembelajaran.
4. Memformat Berbagai Jenis Nombor
Dalam beberapa kes tertentu, kami mungkin ingin memformat nombor untuk jenis tertentu seperti mata wang, bilangan bulat besar, atau peratusan.
4.1. Memformat Integer Besar Dengan Koma
Setiap kali kita mempunyai bilangan bulat besar dalam aplikasi kita, kita mungkin ingin memaparkannya dengan koma, dengan menggunakan DecimalFormat dengan corak yang telah ditentukan:
public static String withLargeIntegers(double value) { DecimalFormat df = new DecimalFormat("###,###,###"); return df.format(value); } int value = 123456789; assertThat(withLargeIntegers(value)).isEqualTo("123,456,789");
4.2. Menambah Nombor
Dalam beberapa kes, kami mungkin mahu memasukkan nombor dengan angka nol untuk panjang yang ditentukan. Di sini, kita dapat menggunakan kaedah format String # , seperti yang dijelaskan sebelumnya:
public static String byPaddingZeros(int value, int paddingLength) { return String.format("%0" + paddingLength + "d", value); } int value = 1; assertThat(byPaddingOutZeros(value, 3)).isEqualTo("001");
4.3. Memformat Nombor Dengan Dua Nol Selepas Perpuluhan
Untuk dapat mencetak sebarang nombor dengan dua angka nol selepas titik perpuluhan, kami akan menggunakan sekali lagi kelas DecimalFormat dengan corak yang telah ditentukan:
public static double withTwoDecimalPlaces(double value) { DecimalFormat df = new DecimalFormat("#.00"); return new Double(df.format(value)); } int value = 12; assertThat(withTwoDecimalPlaces(value)).isEqualTo(12.00);
Dalam kes ini, kami telah membuat format baru dengan corak yang menentukan dua nol setelah titik perpuluhan .
4.4. Pemformatan dan Peratusan
Dari semasa ke semasa kita mungkin perlu menampilkan peratusan.
Dalam kes ini, kita boleh menggunakan kaedah NumberFormat # getPercentInstance . Kaedah ini membolehkan kami memberikan Lokal untuk mencetak nilai dalam format yang betul untuk negara yang anda tentukan:
public static String forPercentages(double value, Locale locale) { NumberFormat nf = NumberFormat.getPercentInstance(locale); return nf.format(value); } double value = 25f / 100f; assertThat(forPercentages(value, new Locale("en", "US"))).isEqualTo("25%");
4.5. Pemformatan Nombor Mata Wang
Cara biasa menyimpan mata wang dalam aplikasi kita adalah dengan menggunakan BigDecimal . Bagaimana jika kita mahu memaparkannya kepada pengguna? Dalam kes ini, kita dapat menggunakan kelas NumberFormat :
public static String currencyWithChosenLocalisation(double value, Locale locale) { NumberFormat nf = NumberFormat.getCurrencyInstance(locale); return nf.format(value); }
Kami mendapat contoh mata wang untuk Lokal tertentu dan kemudian memanggil kaedah format dengan nilainya. Hasilnya adalah nombor yang ditunjukkan sebagai mata wang untuk negara yang ditentukan:
double value = 23_500; assertThat(currencyWithChosenLocalisation(value, new Locale("en", "US"))).isEqualTo("$23,500.00"); assertThat(currencyWithChosenLocalisation(value, new Locale("zh", "CN"))).isEqualTo("¥23,500.00"); assertThat(currencyWithChosenLocalisation(value, new Locale("pl", "PL"))).isEqualTo("23 500 zł");
5. Kes Penggunaan Pemformatan Lanjutan
DecimalFormat adalah salah satu cara yang paling popular untuk memformat nombor perpuluhan di Java. Sama seperti contoh sebelumnya, kami akan menulis kaedah penolong:
public static double withDecimalFormatLocal(double value) { DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.getDefault()); return new Double(df.format(value)); }
Jenis pemformatan kami akan mendapat tetapan lalai untuk penyetempatan tertentu.
Pemformatan perpuluhan ditangani secara berbeza di negara yang berbeza menggunakan sistem angka mereka. Contohnya watak pengelompokan (koma di AS, tetapi spasi atau titik di tempat lain), ukuran pengelompokan (tiga di AS dan kebanyakan tempat, tetapi berbeza di India), atau watak perpuluhan (titik di AS, tetapi koma di tempat lain).
double D = 4.2352989244d; assertThat(withDecimalFormatLocal(D)).isEqualTo(4.235);
Kami juga dapat memperluas fungsi ini untuk memberikan beberapa corak khusus:
public static double withDecimalFormatPattern(double value, int places) { DecimalFormat df2 = new DecimalFormat("#,###,###,##0.00"); DecimalFormat df3 = new DecimalFormat("#,###,###,##0.000"); if (places == 2) return new Double(df2.format(value)); else if (places == 3) return new Double(df3.format(value)); else throw new IllegalArgumentException(); } assertThat(withDecimalFormatPattern(D, 2)).isEqualTo(4.24); assertThat(withDecimalFormatPattern(D, 3)).isEqualTo(4.235);
Di sini kita membenarkan pengguna kita mengkonfigurasi DecimalFormat mengikut corak yang dipilih berdasarkan jumlah ruang.
6. Kesimpulannya
Dalam artikel ini, kami secara ringkas melalui berbagai cara pemformatan nombor di Java. Seperti yang kita lihat tidak ada satu kaedah terbaik untuk melakukan ini. Banyak pendekatan yang mungkin diikuti kerana masing-masing mempunyai ciri tersendiri.
Seperti biasa, kod untuk contoh ini boleh didapati di GitHub.