Pénzösszegek megjelenítése szavakkal
1. Áttekintés
Ebben az oktatóanyagban megtudhatjuk, hogyan alakíthatjuk át a pénzösszeget szómegjelenítéssé Java-ban.
Azt is megnézzük, hogyan nézhet ki egy egyedi megvalósítás egy külső könyvtáron keresztül - a Tradukisto.
2. Végrehajtás
Kezdjük először a saját megvalósításunkkal. Az első lépés kettő deklarálása Húr tömbök a következő elemekkel:
statikus húr [] egyek = {"", "egy", "kettő", "három", "négy", "öt", "hat", "hét", "nyolc", "kilenc", "tíz" , "tizenegy", "tizenkettő", "tizenhárom", "tizennégy", "tizenöt", "tizenhat", "tizenhét", "tizennyolc", "tizenkilenc"}; nyilvános statikus karakterlánc [] tens = {"", // 0 "", // 1 "húsz", // 2 "harminc", // 3 "negyven", // 4 "ötven", // 5 "hatvan ", // 6" hetven ", // 7" nyolcvan ", // 8" kilencven "// 9};
Amikor beérkezik egy bemenet, akkor az érvénytelen értékeket (nulla és negatív érték) kell kezelnünk. Miután megkapta az érvényes bevitelt, kiválthatjuk a dollár és cent számát változókba:
hosszú dollár = (hosszú) pénz; hosszú cent = Math.kör ((pénz - dollár) * 100);
Ha a megadott szám kevesebb, mint 20, akkor megkapjuk a megfelelőt azok' elem a tömbből az index alapján:
if (n <20) {visszatérek [(int) n]; }
Hasonló megközelítést alkalmazunk a 100-nál kisebb számok esetében is, de most ezt kell használnunk tízes tömb is:
if (n <100) {visszatér tíz [[int] n / 10] + ((n% 10! = 0)? "": "") + one [(int) n% 10]; }
Hasonlóan tesszük ezt az ezernél kisebb számok esetében is.
Ezután rekurzív hívásokat használunk az egymilliónál kisebb számok kezelésére, az alábbiak szerint:
if (n <1_000_000) {return konvertálás (n / 1000) + "ezer" + ((n% 1000! = 0)? "": "") + konvertálás (n% 1000); }
Ugyanezt a megközelítést alkalmazzák az egymilliárdnál kisebb számoknál stb.
Itt van a fő módszer, amely meghívható ennek az átalakításnak a végrehajtására:
public static String getMoneyIntoWords (dupla pénz) {hosszú dollár = (hosszú) pénz; hosszú cent = Math.kör ((pénz - dollár) * 100); if (pénz == 0D) {return ""; } if (pénz 0) {dollárrész = konvertálás (dollár) + "dollár" + (dollár == 1? "": "s"); } String centsPart = ""; if (cent> 0) {if (dollarParts.length ()> 0) {centPart = "és"; } centPart + = konvertálás (cent) + "cent" + (cent == 1? "": "s"); } return dollárrész + centrész; }
Teszteljük kódunkat, hogy megbizonyosodjon arról, hogy működik-e:
@Test public void whenGivenDollarsAndCents_thenReturnWords () {String várhatóResult = "kilencszázhuszonnégy dollár és hatvan cent"; assertEquals (várható eredmény, NumberWordConverter.getMoneyIntoWords (924.6)); } @Test public void whenTwoBillionDollarsGiven_thenReturnWords () {String várhatóResult = "kétmilliárd százharminchárommillió kétszáz" + "negyvenhétezernyolcszáz tíz dollár"; assertEquals (várhatóResult, NumberWordConverter.getMoneyIntoWords (2_133_247_810)); } @Test public void whenThirtyMillionDollarsGiven_thenReturnWords () {String várhatóResult = "harminchárom millió háromszáz negyvennyolc ezer kilencszáz hetvennyolc dollár"; assertEquals (várhatóResult, NumberWordConverter.getMoneyIntoWords (33_348_978)); }
Teszteljünk néhány éles esetet is, és győződjünk meg róla, hogy ezeket is lefedtük:
@Test public void whenZeroDollarsGiven_thenReturnEmptyString () {assertEquals ("", NumberWordConverter.getMoneyIntoWords (0)); } @Test public void whenNoDollarsAndNineFiveNineCents_thenCorrectRounding () {assertEquals ("kilencvenhat cent", NumberWordConverter.getMoneyIntoWords (0,959)); } @Test public void whenNoDollarsAndOneCent_thenReturnCentSingular () {assertEquals ("one cent", NumberWordConverter.getMoneyIntoWords (0,01)); }
3. Könyvtár használata
Most, hogy a saját algoritmust megvalósítottuk, végezzük el ezt a konverziót egy meglévő könyvtár használatával.
Tradukisto egy Java 8+ könyvtár, amely segítségünkre lehet a számok szóábrázolássá alakításában. Először be kell importálnunk a projektünkbe (a könyvtár legújabb verziója itt található):
pl.allegro.finance tradukisto 1.0.1
Most már használhatjuk MoneyConverterek’S asWords () módszer ennek az átalakításnak a végrehajtásához:
public String getMoneyIntoWords (karakterlánc bemenet) {MoneyConverters converter = MoneyConverters.ENGLISH_BANKING_MONEY_VALUE; return converter.asWords (új BigDecimal (input)); }
Teszteljük ezt a módszert egy egyszerű tesztesettel:
@Test public void whenGivenDollarsAndCents_thenReturnWordsVersionTwo () {assertEquals ("háromszáz tíz £ 00/100", NumberWordConverter.getMoneyIntoWords ("310")); }
Ehhez használhatnánk az ICU4J könyvtárat is, de ez egy nagy könyvtár, és sok más olyan funkcióval rendelkezik, amelyek nem tartoznak a cikk hatálya alá.
Vessen egy pillantást azonban arra, hogy szükség van-e Unicode és globalizációs támogatásra.
4. Következtetés
Ebben a gyors cikkben két megközelítést láthattunk arról, hogyan lehet a pénzösszeget szavakká konvertálni.
Az itt ismertetett összes példának a kódja, és még sok más megtalálható a GitHubon.