Afficher les montants d'argent en mots

1. Vue d'ensemble

Dans ce tutoriel, nous verrons comment nous pouvons convertir un montant monétaire en représentation de mots en Java.

Nous verrons également à quoi pourrait ressembler une implémentation personnalisée, via une bibliothèque externe - Tradukisto.

2. Mise en œuvre

Commençons par notre propre implémentation. La première étape consiste à déclarer deux tableaux String avec les éléments suivants:

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

Lorsque nous recevons une entrée, nous devons gérer les valeurs invalides (valeurs nulles et négatives). Une fois qu'une entrée valide est reçue, nous pouvons extraire le nombre de dollars et de cents en variables:

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

Si le nombre donné est inférieur à 20, nous aurons les appropriés de ceux de l' élément du tableau en fonction de l'indice:

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

Nous utiliserons une approche similaire pour les nombres inférieurs à 100, mais nous devons maintenant également utiliser un tableau de dizaines :

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

Nous procédons de la même manière pour les nombres inférieurs à mille.

Ensuite, nous utilisons des appels récursifs pour traiter les numéros inférieurs à un million, comme indiqué ci-dessous:

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

La même approche est utilisée pour les nombres inférieurs à un milliard, et ainsi de suite.

Voici la méthode principale qui peut être appelée pour effectuer cette conversion:

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

Testons notre code pour nous assurer qu'il fonctionne:

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

Testons également certains cas extrêmes et nous assurons que nous les avons également couverts:

@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. Utilisation d'une bibliothèque

Maintenant que nous avons implémenté notre propre algorithme, faisons cette conversion en utilisant une bibliothèque existante.

Tradukisto est une bibliothèque pour Java 8+, qui peut nous aider à convertir les nombres en leurs représentations de mots. Tout d'abord, nous devons l'importer dans notre projet (la dernière version de cette bibliothèque peut être trouvée ici):

 pl.allegro.finance tradukisto 1.0.1 

Nous pouvons maintenant utiliser MoneyConverters l » asWords () méthode pour effectuer cette conversion:

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

Testons cette méthode avec un cas de test simple:

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

Nous pourrions également utiliser la bibliothèque ICU4J pour ce faire, mais elle est volumineuse et est livrée avec de nombreuses autres fonctionnalités qui sortent du cadre de cet article.

Cependant, jetez-y un œil si la prise en charge d'Unicode et de la globalisation est nécessaire.

4. Conclusion

Dans cet article rapide, nous avons vu deux approches sur la façon de convertir une somme d'argent en mots.

Le code de tous les exemples expliqués ici, et bien plus encore, peut être trouvé sur GitHub.