Visning af pengebeløb i ord

1. Oversigt

I denne vejledning ser vi, hvordan vi kan konvertere et monetært beløb til ordrepræsentation i Java.

Vi ser også, hvordan en brugerdefineret implementering kan se ud via et eksternt bibliotek - Tradukisto.

2. Implementering

Lad os først starte med vores egen implementering. Det første trin er at erklære to Snor arrays med følgende elementer:

offentlig statisk streng [] ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "ni", "ti" , "elleve", "tolv", "tretten", "fjorten", "femten", "seksten", "sytten", "atten", "nitten"}; offentlig statisk streng [] tens = {"", // 0 "", // 1 "tyve", // 2 "tredive", // 3 "fyrre", // 4 "halvtreds", // 5 "tres ", // 6" halvfjerds ", // 7" firs ", // 8" halvfems "// 9};

Når vi modtager et input, skal vi håndtere de ugyldige værdier (nul og negative værdier). Når et gyldigt input er modtaget, kan vi udtrække antallet af dollars og cent i variabler:

 lange dollars = (lange) penge; lange cent = Math.round ((penge - dollars) * 100);

Hvis det angivne antal er mindre end 20, får vi det passende dem ' element fra arrayet baseret på indekset:

hvis (n <20) {returnerer dem [(int) n]; }

Vi bruger en lignende tilgang til tal mindre end 100, men nu skal vi bruge tiere array også:

hvis (n <100) {returnerer tiere [(int) n / 10] + ((n% 10! = 0)? "": "") + ones [(int) n% 10]; }

Vi gør dette på samme måde for tal, der er mindre end tusind.

Dernæst bruger vi rekursive opkald til at håndtere numre, der er mindre end en million, som vist nedenfor:

hvis (n <1_000_000) {return konverter (n / 1000) + "tusind" + ((n% 1000! = 0)? "": "") + konverter (n% 1000); }

Den samme fremgangsmåde bruges til tal, der er mindre end en milliard osv.

Her er den vigtigste metode, der kan kaldes til at udføre denne konvertering:

 offentlig statisk streng getMoneyIntoWords (dobbelt penge) {lange dollars = (lange) penge; lange cent = Math.round ((penge - dollars) * 100); hvis (penge == 0D) {return ""; } hvis (penge 0) {dollarsPart = konverter (dollars) + "dollar" + (dollars == 1? "": "s"); } Streng centsPart = ""; if (cents> 0) {if (dollarParts.length ()> 0) {centsPart = "and"; } centsPart + = konverter (cent) + "cent" + (cent == 1? "": "s"); } returnere dollarsPart + centsPart; }

Lad os teste vores kode for at sikre, at den fungerer:

@Test offentlig ugyldigt nårGivenDollarsAndCents_thenReturnWords () {String expectResult = "ni hundrede og fireogtyve dollars og tres cent"; assertEquals (expectResult, NumberWordConverter.getMoneyIntoWords (924.6)); } @Test offentlig ugyldig nårTwoBillionDollarsGiven_thenReturnWords () {String expectResult = "to milliarder et hundrede og tredive tre millioner to hundrede" + "syvogfyrre tusind otte hundrede og ti dollars"; assertEquals (expectResult, NumberWordConverter.getMoneyIntoWords (2_133_247_810)); } @Test offentligt ugyldigt nårThirtyMillionDollarsGiven_thenReturnWords () {String expectResult = "tredive tre millioner tre hundrede og fyrre tusind ni hundrede og halvfjerds dollars"; assertEquals (expectResult, NumberWordConverter.getMoneyIntoWords (33_348_978)); }

Lad os også teste nogle kanttilfælde og sørge for, at vi også har dækket dem:

@Test offentlig ugyldig nårZeroDollarsGiven_thenReturnEmptyString () {assertEquals ("", NumberWordConverter.getMoneyIntoWords (0)); } @Test offentligt ugyldigt nårNoDollarsAndNineFiveNineCents_thenCorrectRounding () {assertEquals ("halvfems seks cent", NumberWordConverter.getMoneyIntoWords (0.959)); } @Test offentlig ugyldig nårNoDollarsAndOneCent_thenReturnCentSingular () {assertEquals ("en cent", NumberWordConverter.getMoneyIntoWords (0.01)); } 

3. Brug af et bibliotek

Nu hvor vi har implementeret vores egen algoritme, lad os udføre denne konvertering ved hjælp af et eksisterende bibliotek.

Tradukisto er et bibliotek til Java 8+, som kan hjælpe os med at konvertere tal til deres ordrepræsentationer. Først skal vi importere det til vores projekt (den nyeste version af dette bibliotek kan findes her):

 pl.allegro.finance tradukisto 1.0.1 

Vi kan nu bruge MoneyConverters'S asWords () metode til at udføre denne konvertering:

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

Lad os teste denne metode med et simpelt testtilfælde:

@Test offentlig ugyldigt nårGivenDollarsAndCents_thenReturnWordsVersionTwo () {assertEquals ("tre hundrede ti £ 00/100", NumberWordConverter.getMoneyIntoWords ("310")); }

Vi kunne også bruge ICU4J-biblioteket til at gøre dette, men det er stort og leveres med mange andre funktioner, der er uden for denne artikels anvendelsesområde.

Se dog på det, hvis Unicode og globaliseringsstøtte er nødvendig.

4. Konklusion

I denne hurtige artikel så vi to tilgange til, hvordan man konverterer en sum penge til ord.

Koden til alle eksemplerne forklaret her og meget mere kan findes på GitHub.