Visualizzazione degli importi di denaro in parole

1. Panoramica

In questo tutorial vedremo come convertire un importo monetario in rappresentazione di parole in Java.

Vedremo anche come potrebbe apparire un'implementazione personalizzata, tramite una libreria esterna - Tradukisto.

2. Implementazione

Iniziamo prima con la nostra implementazione. Il primo passaggio è dichiarare due array di stringhe con i seguenti elementi:

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 };

Quando riceviamo un input, dovremo gestire i valori non validi (zero e valori negativi). Una volta ricevuto un input valido, possiamo estrarre il numero di dollari e centesimi in variabili:

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

Se il numero dato è inferiore a 20, poi ci arriveremo appropriate quelli elemento dalla matrice in base all'indice:

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

Useremo un approccio simile per i numeri inferiori a 100, ma ora dobbiamo usare anche l' array delle decine :

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

Lo facciamo in modo simile per i numeri inferiori a mille.

Successivamente, utilizziamo le chiamate ricorsive per gestire i numeri inferiori a un milione, come mostrato di seguito:

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

Lo stesso approccio viene utilizzato per i numeri inferiori a un miliardo e così via.

Ecco il metodo principale che può essere chiamato per eseguire questa conversione:

 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; }

Testiamo il nostro codice per assicurarci che funzioni:

@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)); }

Testiamo anche alcuni casi limite e assicuriamoci di averli trattati anche:

@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. Utilizzo di una libreria

Ora che abbiamo implementato il nostro algoritmo, eseguiamo questa conversione utilizzando una libreria esistente.

Tradukisto è una libreria per Java 8+, che può aiutarci a convertire i numeri nelle loro rappresentazioni di parole. Per prima cosa, dobbiamo importarlo nel nostro progetto (l'ultima versione di questa libreria può essere trovata qui):

 pl.allegro.finance tradukisto 1.0.1 

Ora possiamo usare MoneyConverters s' asWords () metodo per fare questa conversione:

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

Testiamo questo metodo con un semplice test case:

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

Potremmo anche usare la libreria ICU4J per farlo, ma è grande e include molte altre funzionalità che esulano dallo scopo di questo articolo.

Tuttavia, dai un'occhiata se è necessario il supporto Unicode e la globalizzazione.

4. Conclusione

In questo rapido articolo, abbiamo visto due approcci su come convertire una somma di denaro in parole.

Il codice per tutti gli esempi spiegati qui e molto altro può essere trovato su GitHub.