Memaparkan Jumlah Wang dalam Perkataan

1. Gambaran keseluruhan

Dalam tutorial ini, kita akan melihat bagaimana kita dapat mengubah sejumlah wang menjadi perwakilan kata di Java.

Kami juga akan melihat bagaimana implementasi khusus dapat dilihat, melalui perpustakaan luaran - Tradukisto.

2. Pelaksanaan

Mari mulakan dengan pelaksanaan kita sendiri. Langkah pertama adalah untuk menyatakan dua tatasusunan 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 };

Apabila kami menerima input, kami perlu menangani nilai yang tidak sah (nilai sifar dan negatif). Setelah input yang sah diterima, kami dapat mengekstrak jumlah dolar dan sen ke dalam pemboleh ubah:

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

Jika nombor yang diberikan adalah kurang daripada 20, maka kita akan mendapatkan sesuai yang ' elemen dari pelbagai berdasarkan indeks:

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

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

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

Kami melakukan ini sama untuk nombor yang kurang dari seribu.

Seterusnya, kami menggunakan panggilan rekursif untuk menangani nombor yang kurang dari satu juta, seperti yang ditunjukkan di bawah:

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

Pendekatan yang sama digunakan untuk angka yang kurang dari satu bilion, dan seterusnya.

Inilah kaedah utama yang boleh dipanggil untuk melakukan penukaran 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 uji kod kami 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 kes canggih, dan pastikan kita juga membahasnya:

@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 kami menerapkan algoritma kami sendiri, mari lakukan penukaran ini dengan menggunakan perpustakaan yang ada.

Tradukisto adalah perpustakaan untuk Java 8+, yang dapat membantu kita menukar angka menjadi perwakilan kata mereka. Pertama, kita perlu mengimportnya ke dalam projek kita (versi terbaru perpustakaan ini boleh didapati di sini):

 pl.allegro.finance tradukisto 1.0.1 

Kami kini boleh menggunakan MoneyConverters 's asWords () kaedah untuk membuat penukaran ini:

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

Mari uji kaedah ini dengan kes ujian mudah:

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

Kami juga boleh menggunakan perpustakaan ICU4J untuk melakukan ini, tetapi ini adalah perpustakaan yang besar dan dilengkapi dengan banyak ciri lain yang berada di luar ruang lingkup artikel ini.

Namun, perhatikanlah jika Unicode dan sokongan globalisasi diperlukan.

4. Kesimpulan

Dalam artikel ringkas ini, kami melihat dua pendekatan bagaimana melakukan penukaran sejumlah wang menjadi kata-kata.

Kod untuk semua contoh yang dijelaskan di sini, dan banyak lagi boleh didapati di GitHub.