Zobrazenie čiastok peňazí slovami

1. Prehľad

V tomto návode uvidíme, ako môžeme v Jave previesť peňažnú čiastku na slovné zastúpenie.

Uvidíme tiež, ako by mohla vyzerať prispôsobená implementácia, a to prostredníctvom externej knižnice - Tradukisto.

2. Implementácia

Najprv začnime s vlastnou implementáciou. Prvým krokom je vyhlásenie dvoch String polia s týmito prvkami:

public static String [] ones = {"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine", "ten" , „jedenásť“, „dvanásť“, „trinásť“, „štrnásť“, „pätnásť“, „šestnásť“, „sedemnásť“, „osemnásť“, „devätnásť“}; verejný statický reťazec [] tens = {"", // 0 "", // 1 "dvadsať", // 2 "tridsať", // 3 "štyridsať", // 4 "päťdesiat", // 5 "šesťdesiat ", // 6" sedemdesiat ", // 7" osemdesiat ", // 8" deväťdesiat "// 9};

Keď dostaneme vstup, budeme musieť spracovať neplatné hodnoty (nulové a záporné hodnoty). Po prijatí platného vstupu môžeme extrahovať počet dolárov a centov do premenných:

 dlhé doláre = (dlhé) peniaze; dlhé centy = Math.round ((peniaze - doláre) * 100);

Ak je uvedený počet menší ako 20, dostaneme príslušné jedny prvok z poľa na základe indexu:

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

Podobný prístup použijeme pre čísla menšie ako 100, ale teraz musíme použiť desiatky pole tiež:

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

Toto robíme podobne pre čísla, ktoré sú menšie ako tisíc.

Ďalej používame rekurzívne volania na riešenie čísel, ktoré sú menšie ako jeden milión, ako je uvedené nižšie:

if (n <1_000_000) {návratový prevod (n / 1000) + "tisíc" + ((n% 1000! = 0)? "": "") + prevod (n% 1000); }

Rovnaký prístup sa používa pre čísla, ktoré sú menšie ako jedna miliarda atď.

Tu je hlavný spôsob, ktorým je možné túto konverziu zavolať:

 public static String getMoneyIntoWords (dvojité peniaze) {dlhé doláre = (dlhé) peniaze; dlhé centy = Math.round ((peniaze - doláre) * 100); if (peniaze == 0D) {návrat ""; } if (peniaze 0) {dollarsPart = prevádzať (doláre) + "dolár" + (doláre == 1? "": "s"); } Reťazec centsPart = ""; if (centy> 0) {if (dollarParts.length ()> 0) {centsPart = "a"; } centsPart + = prevádzať (centy) + "cent" + (centy == 1? "": "s"); } vrátiť dollarsPart + centsPart; }

Vyskúšajme náš kód, aby sme sa ubezpečili, že funguje:

@Test public void whenGivenDollarsAndCents_thenReturnWords () {String expectResult = "deväťsto dvadsať štyri dolárov a šesťdesiat centov"; assertEquals (expectResult, NumberWordConverter.getMoneyIntoWords (924.6)); } @Test public void whenTwoBillionDollarsGiven_thenReturnWords () {String expectResult = "dve miliardy sto tridsať tri milióny dvesto" + "štyridsať sedem tisíc osemsto desať dolárov"; assertEquals (expectResult, NumberWordConverter.getMoneyIntoWords (2_133_247_810)); } @Test public void whenThirtyMillionDollarsGiven_thenReturnWords () {String expectResult = "tridsať tri milióny tristo štyridsať osem tisíc deväťsto sedemdesiat osem dolárov"; assertEquals (expectResult, NumberWordConverter.getMoneyIntoWords (33_348_978)); }

Poďme tiež otestovať niektoré okrajové prípady a uistite sa, že sme ich pokryli tiež:

@Test public void whenZeroDollarsGiven_thenReturnEmptyString () {assertEquals ("", NumberWordConverter.getMoneyIntoWords (0)); } @Test public void whenNoDollarsAndNineFiveNineCents_thenCorrectRounding () {assertEquals ("deväťdesiatšesť centov", NumberWordConverter.getMoneyIntoWords (0,959)); } @Test public void whenNoDollarsAndOneCent_thenReturnCentSingular () {assertEquals ("one cent", NumberWordConverter.getMoneyIntoWords (0,01)); } 

3. Používanie knižnice

Teraz, keď sme implementovali náš vlastný algoritmus, urobme tento prevod pomocou existujúcej knižnice.

Tradukisto je knižnica pre jazyk Java 8+, ktorá nám môže pomôcť prevádzať čísla na ich slovné reprezentácie. Najskôr ho musíme importovať do nášho projektu (najnovšiu verziu tejto knižnice nájdete tu):

 pl.allegro.financie tradukisto 1.0.1 

Teraz môžeme použiť Prevádzače peňazí‘S asWords () spôsob vykonania tejto konverzie:

public String getMoneyIntoWords (String input) {MoneyConverters converter = MoneyConverters.ENGLISH_BANKING_MONEY_VALUE; návrat converter.asWords (nový BigDecimal (vstup)); }

Vyskúšajme túto metódu na jednoduchom testovacom prípade:

@Test public void whenGivenDollarsAndCents_thenReturnWordsVersionTwo () {assertEquals ("tristo desať £ 00/100", NumberWordConverter.getMoneyIntoWords ("310")); }

Mohli by sme na to použiť aj knižnicu ICU4J, ale je to veľká a prichádza s mnohými ďalšími funkciami, ktoré sú mimo rozsahu tohto článku.

Ak je však potrebná podpora Unicode a globalizácia, pozrite sa na to.

4. Záver

V tomto rýchlom článku sme videli dva prístupy k tomu, ako previesť sumu peňazí na slová.

Kód všetkých príkladov tu vysvetlených a oveľa viac nájdete na GitHub.


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