Geldbeträge in Worten anzeigen

1. Übersicht

In diesem Tutorial werden wir sehen, wie wir einen Geldbetrag in Java in eine Wortdarstellung umwandeln können.

Wir werden auch sehen, wie eine benutzerdefinierte Implementierung über eine externe Bibliothek - Tradukisto - aussehen könnte.

2. Implementierung

Beginnen wir zunächst mit unserer eigenen Implementierung. Der erste Schritt besteht darin, zwei String- Arrays mit den folgenden Elementen zu deklarieren :

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

Wenn wir eine Eingabe erhalten, müssen wir die ungültigen Werte (Null und negative Werte) behandeln. Sobald eine gültige Eingabe eingegangen ist, können wir die Anzahl der Dollar und Cent in Variablen extrahieren:

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

Wenn die angegebene Zahl kleiner als 20 ist, dann werden wir die entsprechenden bekommen Einsen Element aus dem Array auf dem Index basiert:

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

Wir werden einen ähnlichen Ansatz für Zahlen unter 100 verwenden, aber jetzt müssen wir auch das Zehner- Array verwenden:

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

Ähnlich verhält es sich mit Zahlen unter tausend.

Als Nächstes verwenden wir rekursive Aufrufe, um Nummern zu verarbeiten, die weniger als eine Million betragen, wie unten gezeigt:

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

Der gleiche Ansatz wird für Zahlen verwendet, die weniger als eine Milliarde betragen, und so weiter.

Hier ist die Hauptmethode, die für diese Konvertierung aufgerufen werden kann:

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

Testen wir unseren Code, um sicherzustellen, dass er funktioniert:

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

Lassen Sie uns auch einige Randfälle testen und sicherstellen, dass wir sie auch behandelt haben:

@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. Verwenden einer Bibliothek

Nachdem wir unseren eigenen Algorithmus implementiert haben, führen wir diese Konvertierung mithilfe einer vorhandenen Bibliothek durch.

Tradukisto ist eine Bibliothek für Java 8+, mit deren Hilfe wir Zahlen in ihre Wortdarstellungen umwandeln können. Zuerst müssen wir es in unser Projekt importieren (die neueste Version dieser Bibliothek finden Sie hier):

 pl.allegro.finance tradukisto 1.0.1 

Wir können jetzt MoneyConverters ‚s asWords () Methode tun , um diese Umwandlung:

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

Testen wir diese Methode mit einem einfachen Testfall:

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

Wir könnten auch die ICU4J-Bibliothek verwenden, um dies zu tun, aber sie ist groß und enthält viele andere Funktionen, die nicht in den Geltungsbereich dieses Artikels fallen.

Sehen Sie sich jedoch an, ob Unterstützung für Unicode und Globalisierung erforderlich ist.

4. Fazit

In diesem kurzen Artikel haben wir zwei Ansätze gesehen, wie man eine Geldsumme in Worte umwandelt.

Den Code für alle hier erläuterten Beispiele und vieles mehr finden Sie auf GitHub.