Viser pengebeløp i ord

1. Oversikt

I denne opplæringen ser vi hvordan vi kan konvertere et pengebeløp til ordrepresentasjon i Java.

Vi får også se hvordan en tilpasset implementering kan se ut, via et eksternt bibliotek - Tradukisto.

2. Implementering

La oss først starte med vår egen implementering. Det første trinnet er å erklære to String 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 "tjue", // 2 "tretti", // 3 "førti", // 4 "femti", // 5 "seksti ", // 6" sytti ", // 7" åtti ", // 8" nitti "// 9};

Når vi mottar en innspill, må vi håndtere de ugyldige verdiene (null og negative verdier). Når en gyldig inngang er mottatt, kan vi trekke ut antall dollar og cent i variabler:

 lange dollar = (lange) penger; lange cent = Math.round ((penger - dollar) * 100);

Hvis tallet som er gitt er mindre enn 20, får vi riktig de ' element fra matrisen basert på indeksen:

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

Vi bruker en lignende tilnærming for tall mindre enn 100, men nå må vi bruke tiere array også:

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

Vi gjør dette på samme måte for tall som er mindre enn tusen.

Deretter bruker vi rekursive samtaler for å håndtere tall som er mindre enn en million, som vist nedenfor:

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

Den samme tilnærmingen brukes for tall som er mindre enn en milliard, og så videre.

Her er hovedmetoden som kan kalles for å gjøre denne konverteringen:

 offentlig statisk streng getMoneyIntoWords (dobbel penger) {lange dollar = (lange) penger; lange cent = Math.round ((penger - dollar) * 100); hvis (penger == 0D) {return ""; } if (money 0) {dollarsPart = convert (dollars) + "dollar" + (dollars == 1? "": "s"); } Streng centsPart = ""; if (cent> 0) {if (dollarParts.length ()> 0) {centsPart = "and"; } centsPart + = convert (cent) + "cent" + (cent == 1? "": "s"); } returnere dollarPart + centPart; }

La oss teste koden vår for å sikre at den fungerer:

@Test offentlig annullert nårGivenDollarsAndCents_thenReturnWords () {String expectResult = "ni hundre og tjue fire dollar og seksti cent"; assertEquals (expectResult, NumberWordConverter.getMoneyIntoWords (924.6)); } @Test offentlig ugyldig nårTwoBillionDollarsGiven_thenReturnWords () {String expectResult = "to milliarder hundre og tretti tre millioner to hundre" + "førtisju tusen åtte hundre og ti dollar"; assertEquals (expectResult, NumberWordConverter.getMoneyIntoWords (2_133_247_810)); } @Test offentlig ugyldig nårThirtyMillionDollarsGiven_thenReturnWords () {String expectResult = "trettito millioner tre hundre og førti åtte tusen ni hundre og sytti dollar"; assertEquals (expectResult, NumberWordConverter.getMoneyIntoWords (33_348_978)); }

La oss også teste noen kantsaker, og sørge for at vi også har dekket dem:

@Test offentlig ugyldig nårZeroDollarsGiven_thenReturnEmptyString () {assertEquals ("", NumberWordConverter.getMoneyIntoWords (0)); } @Test offentlig ugyldig nårNoDollarsAndNineFiveNineCents_thenCorrectRounding () {assertEquals ("nitti seks cent", NumberWordConverter.getMoneyIntoWords (0.959)); } @Test offentlig ugyldig nårNoDollarsAndOneCent_thenReturnCentSingular () {assertEquals ("ett øre", NumberWordConverter.getMoneyIntoWords (0.01)); } 

3. Bruke et bibliotek

Nå som vi har implementert vår egen algoritme, la oss gjøre denne konverteringen ved å bruke et eksisterende bibliotek.

Tradukisto er et bibliotek for Java 8+, som kan hjelpe oss med å konvertere tall til deres ordrepresentasjoner. Først må vi importere det til prosjektet vårt (den siste versjonen av dette biblioteket finner du her):

 pl.allegro.finance tradukisto 1.0.1 

Vi kan nå bruke MoneyConverters‘S asWords () metode for å gjøre denne konverteringen:

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

La oss teste denne metoden med en enkel testtilfelle:

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

Vi kan også bruke ICU4J-biblioteket til å gjøre dette, men det er stort og kommer med mange andre funksjoner som er utenfor omfanget av denne artikkelen.

Ta imidlertid en titt på det hvis Unicode og globaliseringsstøtte er nødvendig.

4. Konklusjon

I denne raske artikkelen så vi to tilnærminger til hvordan vi konverterer en sum penger til ord.

Koden for alle eksemplene som er forklart her, og mye mer finner du på GitHub.


$config[zx-auto] not found$config[zx-overlay] not found