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.