Menampilkan Jumlah Uang dalam Kata-kata

1. Ikhtisar

Dalam tutorial ini, kita akan melihat bagaimana kita dapat mengubah jumlah uang menjadi representasi kata di Java.

Kami juga akan melihat bagaimana implementasi kustom bisa terlihat, melalui perpustakaan eksternal - Tradukisto.

2. Implementasi

Mari kita mulai dengan implementasi kita sendiri. Langkah pertama adalah mendeklarasikan dua array String dengan elemen berikut:

public static String[] ones = { "", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten", "eleven", "twelve", "thirteen", "fourteen", "fifteen", "sixteen", "seventeen", "eighteen", "nineteen" }; public static String[] tens = { "", // 0 "", // 1 "twenty", // 2 "thirty", // 3 "forty", // 4 "fifty", // 5 "sixty", // 6 "seventy", // 7 "eighty", // 8 "ninety" // 9 };

Saat kami menerima masukan, kami harus menangani nilai yang tidak valid (nilai nol dan negatif). Setelah masukan yang valid diterima, kita dapat mengekstrak jumlah dolar dan sen menjadi variabel:

 long dollars = (long) money; long cents = Math.round((money - dollars) * 100);

Jika angka yang diberikan kurang dari 20, maka kita akan mendapatkan elemen yang sesuai dari array berdasarkan indeks:

if (n < 20) { return ones[(int) n]; }

Kami akan menggunakan pendekatan serupa untuk angka kurang dari 100, tetapi sekarang kami harus menggunakan larik puluhan juga:

if (n < 100) { return tens[(int) n / 10] + ((n % 10 != 0) ? " " : "") + ones[(int) n % 10]; }

Kami melakukan ini dengan cara yang sama untuk angka yang kurang dari seribu.

Selanjutnya, kami menggunakan panggilan rekursif untuk menangani angka yang kurang dari satu juta, seperti yang ditunjukkan di bawah ini:

if (n < 1_000_000) { return convert(n / 1000) + " thousand" + ((n % 1000 != 0) ? " " : "") + convert(n % 1000); }

Pendekatan yang sama digunakan untuk bilangan yang kurang dari satu miliar, dan seterusnya.

Berikut adalah metode utama yang dapat dipanggil untuk melakukan konversi ini:

 public static String getMoneyIntoWords(double money) { long dollars = (long) money; long cents = Math.round((money - dollars) * 100); if (money == 0D) { return ""; } if (money  0) { dollarsPart = convert(dollars) + " dollar" + (dollars == 1 ? "" : "s"); } String centsPart = ""; if (cents > 0) { if (dollarParts.length() > 0) { centsPart = " and "; } centsPart += convert(cents) + " cent" + (cents == 1 ? "" : "s"); } return dollarsPart + centsPart; }

Mari kita uji kode kita untuk memastikannya berfungsi:

@Test public void whenGivenDollarsAndCents_thenReturnWords() { String expectedResult = "nine hundred twenty four dollars and sixty cents"; assertEquals( expectedResult, NumberWordConverter.getMoneyIntoWords(924.6)); } @Test public void whenTwoBillionDollarsGiven_thenReturnWords() { String expectedResult = "two billion one hundred thirty three million two hundred" + " forty seven thousand eight hundred ten dollars"; assertEquals( expectedResult, NumberWordConverter.getMoneyIntoWords(2_133_247_810)); } @Test public void whenThirtyMillionDollarsGiven_thenReturnWords() { String expectedResult = "thirty three million three hundred forty eight thousand nine hundred seventy eight dollars"; assertEquals( expectedResult, NumberWordConverter.getMoneyIntoWords(33_348_978)); }

Mari kita juga menguji beberapa kasus tepi, dan pastikan kita telah menutupinya juga:

@Test public void whenZeroDollarsGiven_thenReturnEmptyString() { assertEquals("", NumberWordConverter.getMoneyIntoWords(0)); } @Test public void whenNoDollarsAndNineFiveNineCents_thenCorrectRounding() { assertEquals( "ninety six cents", NumberWordConverter.getMoneyIntoWords(0.959)); } @Test public void whenNoDollarsAndOneCent_thenReturnCentSingular() { assertEquals( "one cent", NumberWordConverter.getMoneyIntoWords(0.01)); } 

3. Menggunakan Perpustakaan

Sekarang setelah kita menerapkan algoritme kita sendiri, mari lakukan konversi ini dengan menggunakan pustaka yang ada.

Tradukisto adalah perpustakaan untuk Java 8+, yang dapat membantu kita mengonversi angka menjadi representasi kata mereka. Pertama, kita perlu mengimpornya ke dalam proyek kita (versi terbaru pustaka ini dapat ditemukan di sini):

 pl.allegro.finance tradukisto 1.0.1 

Kami sekarang dapat menggunakan MoneyConverters 's asWords () metode untuk melakukan konversi ini:

public String getMoneyIntoWords(String input) { MoneyConverters converter = MoneyConverters.ENGLISH_BANKING_MONEY_VALUE; return converter.asWords(new BigDecimal(input)); }

Mari kita uji metode ini dengan kasus uji sederhana:

@Test public void whenGivenDollarsAndCents_thenReturnWordsVersionTwo() { assertEquals( "three hundred ten £ 00/100", NumberWordConverter.getMoneyIntoWords("310")); }

Kami juga dapat menggunakan pustaka ICU4J untuk melakukan ini, tetapi pustaka itu besar dan dilengkapi dengan banyak fitur lain yang berada di luar cakupan artikel ini.

Namun, lihatlah jika Unicode dan dukungan globalisasi diperlukan.

4. Kesimpulan

Dalam artikel singkat ini, kami melihat dua pendekatan tentang bagaimana melakukan konversi sejumlah uang menjadi kata-kata.

Kode untuk semua contoh yang dijelaskan di sini, dan lebih banyak lagi dapat ditemukan di GitHub.