Anzeige von Geldbeträgen in Worten

Geldbeträge in Worten anzeigen

1. Überblick

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 aussehen könnte -Tradukisto.

2. Implementierung

Beginnen wir zunächst mit unserer eigenen Implementierung. The first step is to declare two String arrays mit folgenden Elementen:

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. Once a valid input is received, we can extract the number of dollars and cents into variables:

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

Wenn die angegebene Zahl kleiner als 20 ist, erhalten wir das entsprechendeones'-Element aus dem Array basierend auf dem Index:

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 Arraytensverwenden:

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

Wir machen das ähnlich für Zahlen, die weniger als eintausend sind.

Als nächstes verwenden wir rekursive Aufrufe, um mit Nummern umzugehen, die weniger als eine Million sind, 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 aufgerufen werden kann, um diese Konvertierung durchzuführen:

 public static String getMoneyIntoWords(double money) {
    long dollars = (long) money;
    long cents = Math.round((money - dollars) * 100);
    if (money == 0D) {
        return "";
    }
    if (money < 0) {
        return INVALID_INPUT_GIVEN;
    }
    String dollarsPart = "";
    if (dollars > 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));
}

Testen wir auch einige Randfälle und stellen Sie sicher, 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 konvertieren können. Zuerst müssen wir es in unser Projekt importieren (die neueste Version dieser Bibliothek finden Sie unterhere):


    pl.allegro.finance
    tradukisto
    1.0.1

Wir können jetztMoneyConvertersasWords() Methode verwenden, um diese Konvertierung durchzuführen:

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 dieICU4J-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 das jedoch an, wenn Sie Unterstützung für Unicode und Globalisierung benötigen.

4. Fazit

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

Der Code für alle hier erläuterten Beispiele und vieles mehr finden Sie inover on GitHub.