Geldbedragen in woorden weergeven

1. Overzicht

In deze tutorial zullen we zien hoe we een geldbedrag kunnen omzetten in woorden-representatie in Java.

We zullen ook zien hoe een aangepaste implementatie eruit zou kunnen zien, via een externe bibliotheek - Tradukisto.

2. Implementatie

Laten we eerst beginnen met onze eigen implementatie. De eerste stap is om er twee te declareren Draad arrays met de volgende elementen:

openbare statische tekenreeks [] ones = {"", "één", "twee", "drie", "vier", "vijf", "zes", "zeven", "acht", "negen", "tien" , "elf", "twaalf", "dertien", "veertien", "vijftien", "zestien", "zeventien", "achttien", "negentien"}; openbare statische tekenreeks [] tientallen = {"", // 0 "", // 1 "twintig", // 2 "dertig", // 3 "veertig", // 4 "vijftig", // 5 "zestig ", // 6" zeventig ", // 7" tachtig ", // 8" negentig "// 9};

Als we een invoer ontvangen, moeten we de ongeldige waarden (nul en negatieve waarden) afhandelen. Zodra een geldige invoer is ontvangen, kunnen we het aantal dollars en centen extraheren in variabelen:

 lange dollars = (long) geld; lange cent = Math.round ((geld - dollars) * 100);

Als het gegeven aantal kleiner is dan 20, dan krijgen we het juiste nummer degenen ' element uit de array op basis van de index:

if (n <20) {retourneer enen [(int) n]; }

We zullen een vergelijkbare benadering gebruiken voor getallen onder de 100, maar nu moeten we gebruiken tientallen array ook:

if (n <100) {retourneer tientallen [(int) n / 10] + ((n% 10! = 0)? "": "") + enen [(int) n% 10]; }

We doen dit op dezelfde manier voor getallen die kleiner zijn dan duizend.

Vervolgens gebruiken we recursieve oproepen om nummers van minder dan een miljoen af ​​te handelen, zoals hieronder wordt weergegeven:

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

Dezelfde benadering wordt gebruikt voor getallen die kleiner zijn dan een miljard, enzovoort.

Hier is de belangrijkste methode die kan worden aangeroepen om deze conversie uit te voeren:

 openbare statische String getMoneyIntoWords (dubbel geld) {lange dollars = (lang) geld; lange cent = Math.round ((geld - dollars) * 100); if (money == 0D) {return ""; } if (geld 0) {dollarsPart = convert (dollars) + "dollar" + (dollars == 1? "": "s"); } String centsPart = ""; if (cents> 0) {if (dollarParts.length ()> 0) {centsPart = "en"; } centsPart + = convert (cents) + "cent" + (cents == 1? "": "s"); } retourneer dollarsPart + centsPart; }

Laten we onze code testen om er zeker van te zijn dat deze werkt:

@Test openbare leegte whenGivenDollarsAndCents_thenReturnWords () {String verwachtResult = "negenhonderd vierentwintig dollar en zestig cent"; assertEquals (verwachtResultaat, NumberWordConverter.getMoneyIntoWords (924.6)); } @Test openbare leegte whenTwoBillionDollarsGiven_thenReturnWords () {String verwachtResult = "twee miljard honderd drieëndertig miljoen tweehonderd" + "zevenenveertig duizend achthonderd tien dollar"; assertEquals (verwachtResultaat, NumberWordConverter.getMoneyIntoWords (2_133_247_810)); } @Test public void whenThirtyMillionDollarsGiven_thenReturnWords () {String verwachtResult = "drieëndertig miljoen driehonderd achtenveertig duizend negenhonderd achtenzeventig dollar"; assertEquals (verwachtResultaat, NumberWordConverter.getMoneyIntoWords (33_348_978)); }

Laten we ook enkele randgevallen testen en ervoor zorgen dat we ze ook hebben behandeld:

@Test openbare leegte whenZeroDollarsGiven_thenReturnEmptyString () {assertEquals ("", NumberWordConverter.getMoneyIntoWords (0)); } @Test openbare leegte whenNoDollarsAndNineFiveNineCents_thenCorrectRounding () {assertEquals ("zesennegentig cent", NumberWordConverter.getMoneyIntoWords (0.959)); } @Test openbare leegte whenNoDollarsAndOneCent_thenReturnCentSingular () {assertEquals ("één cent", NumberWordConverter.getMoneyIntoWords (0.01)); } 

3. Met behulp van een bibliotheek

Nu we ons eigen algoritme hebben geïmplementeerd, gaan we deze conversie uitvoeren door een bestaande bibliotheek te gebruiken.

Tradukisto is een bibliotheek voor Java 8+, die ons kan helpen getallen om te zetten naar hun woordvoorstellingen. Eerst moeten we het in ons project importeren (de nieuwste versie van deze bibliotheek is hier te vinden):

 pl.allegro.finance tradukisto 1.0.1 

We kunnen nu gebruiken MoneyConverters‘S asWords () methode om deze conversie uit te voeren:

openbare tekenreeks getMoneyIntoWords (tekenreeksinvoer) {MoneyConverters-omzetter = MoneyConverters.ENGLISH_BANKING_MONEY_VALUE; return converter.asWords (nieuwe BigDecimal (invoer)); }

Laten we deze methode testen met een eenvoudige testcase:

@Test openbare ongeldigheid whenGivenDollarsAndCents_thenReturnWordsVersionTwo () {assertEquals ("driehonderd tien £ 00/100", NumberWordConverter.getMoneyIntoWords ("310")); }

We zouden ook de ICU4J-bibliotheek kunnen gebruiken om dit te doen, maar het is een grote bibliotheek en wordt geleverd met vele andere functies die buiten het bestek van dit artikel vallen.

Bekijk het echter als Unicode en ondersteuning voor globalisering nodig zijn.

4. Conclusie

In dit korte artikel hebben we twee benaderingen gezien voor het omzetten van een geldbedrag in woorden.

De code voor alle voorbeelden die hier worden uitgelegd, en nog veel meer, is te vinden op GitHub.


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