Pemformatan Angka di Jawa

1. Ikhtisar

Dalam tutorial ini, kita akan melihat berbagai pendekatan untuk pemformatan angka di Java dan cara menerapkannya.

2. Pemformatan Angka Dasar dengan format String #

The String # Format Metode ini sangat berguna untuk memformat angka. Metode ini membutuhkan dua argumen. Argumen pertama menjelaskan pola tentang berapa banyak tempat desimal 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 Desimal dengan Pembulatan

Di Jawa, kami memiliki dua tipe primitif yang mewakili angka desimal - float dan desimal :

double myDouble = 7.8723d; float myFloat = 7.8723f;

Jumlah tempat desimal dapat berbeda bergantung pada operasi yang dilakukan. Dalam kebanyakan kasus, kami hanya tertarik pada beberapa tempat desimal pertama. Mari kita lihat beberapa cara untuk memformat desimal dengan pembulatan.

3.1. Menggunakan BigDecimal untuk Pemformatan Angka

Kelas BigDecimal menyediakan metode untuk membulatkan ke sejumlah tempat desimal tertentu. Mari buat metode pembantu yang akan mengembalikan ganda, dibulatkan 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 mulai dengan instance baru BigDecimal dengan nilai desimal asli kami. Kemudian, dengan mengatur skala, kami memberikan jumlah tempat desimal yang kami inginkan dan bagaimana kami ingin membulatkan angka kami . Menggunakan metode ini memungkinkan kita untuk dengan mudah memformat nilai ganda :

double D = 4.2352989244d; assertThat(withBigDecimal(D, 2)).isEqualTo(4.24); assertThat(withBigDecimal(D, 3)).isEqualTo(4.235);

3.2. Menggunakan putaran Matematika #

Kita juga dapat memanfaatkan metode statis di kelas Matematika untuk membulatkan nilai ganda ke tempat desimal yang ditentukan. Dalam hal ini, kita dapat menyesuaikan jumlah tempat desimal dengan mengalikan dan kemudian membaginya dengan 10 ^ n . Mari kita periksa metode helper 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);

Namun, cara ini hanya disarankan dalam kasus tertentu karena terkadang keluaran mungkin dibulatkan secara berbeda seperti yang diharapkan sebelum dicetak.

Ini karena ronde Math # memotong nilainya . Mari kita lihat bagaimana ini bisa terjadi:

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 

Jadi, metode tersebut hanya terdaftar untuk tujuan pembelajaran.

4. Memformat Jenis Angka yang Berbeda

Dalam beberapa kasus tertentu, kami mungkin ingin memformat angka untuk jenis tertentu seperti mata uang, bilangan bulat besar, atau persentase.

4.1. Memformat Integer Besar Dengan Koma

Setiap kali kita memiliki bilangan bulat besar dalam aplikasi kita, kita mungkin ingin menampilkannya dengan koma, dengan menggunakan DecimalFormat dengan pola 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. Mengisi Nomor

Dalam beberapa kasus, kami mungkin ingin menambahkan angka dengan nol untuk panjang tertentu. Di sini, kita dapat menggunakan metode 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 Angka Dengan Dua Angka Nol Setelah Desimal

Untuk dapat mencetak nomor tertentu dengan dua nol setelah koma desimal, kita akan menggunakan kelas DecimalFormat sekali lagi dengan pola 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 kasus ini, kami telah membuat format baru dengan pola yang menentukan dua angka nol setelah koma desimal .

4.4. Pemformatan dan Persentase

Dari waktu ke waktu kami mungkin perlu menampilkan persentase.

Dalam hal ini, kita bisa menggunakan metode NumberFormat # getPercentInstance . Metode ini memungkinkan kami menyediakan Lokal untuk mencetak nilai dalam format yang benar 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 Angka Mata Uang

Cara umum untuk menyimpan mata uang dalam aplikasi kita adalah dengan menggunakan BigDecimal . Bagaimana jika kita ingin menampilkannya kepada pengguna? Dalam hal ini, kita dapat menggunakan kelas NumberFormat :

public static String currencyWithChosenLocalisation(double value, Locale locale) { NumberFormat nf = NumberFormat.getCurrencyInstance(locale); return nf.format(value); }

Kami mendapatkan contoh mata uang untuk Lokal tertentu dan kemudian cukup memanggil metode format dengan nilai. Hasilnya adalah angka yang ditampilkan sebagai mata uang 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. Kasus Penggunaan Pemformatan Lanjutan

DecimalFormat adalah salah satu cara paling populer untuk memformat angka desimal di Java. Mirip dengan contoh sebelumnya, kami akan menulis metode pembantu:

public static double withDecimalFormatLocal(double value) { DecimalFormat df = (DecimalFormat) NumberFormat.getNumberInstance(Locale.getDefault()); return new Double(df.format(value)); }

Jenis pemformatan kami akan mendapatkan setelan default untuk pelokalan tertentu.

Pemformatan desimal ditangani secara berbeda di berbagai negara menggunakan sistem numerik mereka. Misalnya karakter pengelompokan (koma di AS, tetapi spasi atau titik di lokal lain), ukuran pengelompokan (tiga di AS dan sebagian besar lokal, tetapi berbeda di India), atau karakter desimal (titik di AS, tetapi a koma di lokal lain).

double D = 4.2352989244d; assertThat(withDecimalFormatLocal(D)).isEqualTo(4.235);

Kami juga dapat memperluas fungsionalitas ini untuk menyediakan beberapa pola tertentu:

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 kami mengizinkan pengguna kami untuk mengkonfigurasi DecimalFormat dengan pola yang dipilih berdasarkan jumlah spasi.

6. Kesimpulan

Pada artikel ini, kami secara singkat membahas berbagai cara pemformatan angka di Jawa. Seperti yang bisa kita lihat, tidak ada cara terbaik untuk melakukan ini. Banyak pendekatan dapat diikuti karena masing-masing memiliki karakteristiknya sendiri.

Seperti biasa, kode untuk contoh ini tersedia di GitHub.