Prikazivanje iznosa novca u riječima

1. Pregled

U ovom uputstvu vidjet ćemo kako možemo pretvoriti novčani iznos u predstavljanje riječi u Javi.

Također ćemo vidjeti kako bi mogla izgledati prilagođena implementacija putem vanjske knjižnice - Tradukisto.

2. Provedba

Krenimo prvo s vlastitom implementacijom. Prvi korak je prijaviti dva Niz nizovi sa sljedećim elementima:

javni statički niz [] one = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" , "jedanaest", "dvanaest", "trinaest", "četrnaest", "petnaest", "šesnaest", "sedamnaest", "osamnaest", "devetnaest"}; javni statički niz [] tens = {"", // 0 "", // 1 "dvadeset", // 2 "trideset", // 3 "četrdeset", // 4 "pedeset", // 5 "šezdeset ", // 6" sedamdeset ", // 7" osamdeset ", // 8" devedeset "// 9};

Kad primimo ulaz, trebat ćemo obraditi nevažeće vrijednosti (nula i negativne vrijednosti). Nakon što primimo valjani unos, možemo izdvojiti broj dolara i centi u varijable:

 dugi dolari = (dugi) novac; dugi centi = Math.round ((novac - dolari) * 100);

Ako je navedeni broj manji od 20, dobit ćemo odgovarajući one ' element iz niza na temelju indeksa:

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

Koristit ćemo sličan pristup za brojeve manje od 100, ali sada to moramo koristiti desetke niz također:

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

To činimo slično za brojeve manje od tisuću.

Dalje, rekurzivne pozive koristimo za rješavanje brojeva manjih od jednog milijuna, kao što je prikazano u nastavku:

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

Isti se pristup koristi za brojeve manje od jedne milijarde itd.

Evo glavne metode koju možemo pozvati za ovu pretvorbu:

 javni statični niz getMoneyIntoWords (dvostruki novac) {dugački dolari = (dugi) novac; dugi centi = Math.round ((novac - dolari) * 100); if (novac == 0D) {return ""; } if (novac 0) {dolaraPart = pretvoriti (dolara) + "dolar" + (dolara == 1? "": "s"); } Niz centsPart = ""; if (cents> 0) {if (dollarParts.length ()> 0) {centsPart = "i"; } centsPart + = pretvori (centi) + "cent" + (cents == 1? "": "s"); } vratiti dollarPart + centsPart; }

Isprobajmo naš kod kako bismo bili sigurni da radi:

@Test javna void whenGivenDollarsAndCents_thenReturnWords () {String ожиdeResult = "devetsto dvadeset četiri dolara i šezdeset centi"; assertEquals (očekivani rezultat, NumberWordConverter.getMoneyIntoWords (924,6)); } @Test javna praznina whenTwoBillionDollarsGiven_thenReturnWords () {String očekujeResult = "dvije milijarde sto trideset tri milijuna dvjesto" + "četrdeset sedam tisuća osamsto deset dolara"; assertEquals (očekivani rezultat, NumberWordConverter.getMoneyIntoWords (2_133_247_810)); } @Test javna praznina kadaThirtyMillionDollarsGiven_thenReturnWords () {String očekujeResult = "trideset i tri milijuna tristo četrdeset osam tisuća devetsto sedamdeset i osam dolara"; assertEquals (očekivani rezultat, NumberWordConverter.getMoneyIntoWords (33_348_978)); }

Isprobajmo i neke rubne slučajeve i pobrinimo se da smo ih i pokrili:

@Test javna void whenZeroDollarsGiven_thenReturnEmptyString () {assertEquals ("", NumberWordConverter.getMoneyIntoWords (0)); } @Test javna void whenNoDollarsAndNineFiveNineCents_thenCorrectRounding () {assertEquals ("devedeset šest centi", NumberWordConverter.getMoneyIntoWords (0.959)); } @Test javna void whenNoDollarsAndOneCent_thenReturnCentSingular () {assertEquals ("jedan cent", NumberWordConverter.getMoneyIntoWords (0.01)); } 

3. Korištenje knjižnice

Sad kad smo implementirali vlastiti algoritam, učinimo ovu pretvorbu pomoću postojeće knjižnice.

Tradukisto je knjižnica za Javu 8+ koja nam može pomoći pretvoriti brojeve u njihove reprezentacije riječi. Prvo ga moramo uvesti u naš projekt (najnoviju verziju ove knjižnice možete pronaći ovdje):

 pl.allegro.finance tradukisto 1.0.1 

Sada možemo koristiti Pretvarači novca‘S asWords () metoda za izvršenje ove pretvorbe:

javni String getMoneyIntoWords (unos niza) {MoneyConverters converter = MoneyConverters.ENGLISH_BANKING_MONEY_VALUE; return converter.asWords (novi BigDecimal (ulaz)); }

Isprobajmo ovu metodu jednostavnim test slučajem:

@Test javna praznina kadaGivenDollarsAndCents_thenReturnWordsVersionTwo () {assertEquals ("tristo deset £ 00/100", NumberWordConverter.getMoneyIntoWords ("310")); }

Za to bismo mogli koristiti i knjižnicu ICU4J, ali ona je velika i dolazi s mnogim drugim značajkama koje su izvan dosega ovog članka.

Međutim, pogledajte je li potrebna podrška za Unicode i globalizaciju.

4. Zaključak

U ovom kratkom članku vidjeli smo dva pristupa kako pretvoriti novčani iznos u riječi.

Kôd za sve primjere ovdje objašnjene i još mnogo toga možete pronaći na GitHubu.