Převod čísla na slovní vyjádření
Každý z nás se jistě někdy v životě setkal se situací, kdy je potřeba obyčejné číslo převést na textové vyjádření. Vzpomeňte si například na formuláře složenek pro zaslání peněžní hotovosti na poště. Říkáte, že o nic nejde, prostě si přečtete částku a napíšete ji slovy? Ale co když má podobnou operaci provádět nezávisle na vás nějaký program?
Pokud se na problém podíváme zblízka, zjistíme, že máme k dispozici velice jednoduchý způsob, jak převodu dosáhnout. Jedná se vlastně o přesně stejný postup, jakým tento převod realizuje náš mozek – tedy přečtení daného čísla a jeho interpretace. Vezměme si například číslo 10 758
– ano, čtete jej správně, deset tisíc sedm set padesát osm.
Postup „strojového čtení“ je velmi jednoduchý. Potřebujeme číselný řetězec rozdělit na jednotlivá číslice, které postupně projdeme a zapamatujeme si jejich pozici. Pozice každé číslice je velice důležitá, neboť se jedná o řády, ve kterých se vyskytuje. Každý řád má pro každou číslici jiné slovní vyjádření, například, budeme-li v řádu stovek, číslice osm
značí osm set
, budeme-li v řádu desetitisíců, číslice osm
značí osmdesát tisíc
.
Pro vyhodnocování, jakým řetězcem bude to které číslo reprezentováno, použijeme pomyslného „slovníku“ výrazů. Vytvoříme si dvourozměrné pole (vlastně matici), které bude na místě jednotlivých prvků obsahovat textové řetězce pro vyjádření jejich číselných ekvivalentů. První rozměr matice vyjadřuje řád – tedy „0“ jsou jednotky, „1“ jsou desítky, „2“ jsou stovky, „3“ jsou tisíce…
<%@language=“JavaScript“%>
<%
var slovnik = new Array();
slovnik[0] = new Array(„“, „jedna“, „dvě“, „tři“, „čtyři“, „pět“, „šest“, „sedm“, „osm“, „devět“);
// řád desítek neobsahuje číslo deset, protože v případě, kdy jde o číslo v rozmezí 10-19, je nutné použít alternativního slovníku
slovnik[1] = new Array(„“, „“, „dvacet“, „třicet“, „čtyřicet“, „padesát“, „šedesát“, „sedmdesát“, „osmdesát“, „devadesát“);
slovnik[2] = new Array(„“, „sto“, „dvěstě“, „třista“, „čtyřista“, „pětset“, „šestset“, „sedmset“, „osmset“, „devětset“);
slovnik[3] = new Array(„tisíc“, „tisíc“, „dvatisíce“, „třitisíce“, „čtyřitisíce“, „pěttisíc“, „šesttisíc“, „sedmtisíc“, „osmtisíc“,“devěttisíc“);
slovnik[4] = new Array(„“, „deset“, „dvacet“, „třicet“, „čtyřicet“, „padesát“, „šedesát“, „sedmdesát“, „osmdesát“, „devadesát“);
slovnik[5] = new Array(„“, „sto“, „dvěstě“, „třista“, „čtyřista“, „pětset“, „šestset“, „sedmset“, „osmset“, „devětset“);
%>
Algoritmus rozložení původního čísla a nahrazení jednotlivých částí může vypadat následovně:
<%@language=“JavaScript“%>
<%
// načtení parametru – samotného čísla pro převod do textu
var numero = Request.QueryString(„NMR“)+““;
var outputStr = „“;
// omezení délky vstupního řetězce
if (numero.length<7){
// projdeme postupně celým řetězcem od začátku do konce
for (var x=0; x <= numero.length-1; x++){
// nezbytná podmínka – jsme-li v řádu desítek a je obsaženo číslo jedna, použijeme alternativní slovník
if ((x == numero.length-2) && (numero.charAt(x)==“1″)) {
outputStr += slovnik2[numero.charAt(x+1)];
break;
} else {
// vybere slovní vyjádření ze slovníku odpovídající správnému řádu a číslu
outputStr += slovnik[numero.length-1-x][numero.charAt(x)];
}
}
} else {
outputStr = „Moc velké číslo. Umím převádět pouze do řádu stovek tisíc.“;
}
//vypíše poskládaný výstup
Response.Write(„outputStr“);
%>
Jak je z uvedeného zdrojového kódu patrné, nesmíme zapomenout na jednu důležitou věc. Řády desítek v rozmezí deseti až dvaceti jsou totiž interpretovány jinak, než ostatní řády. Důvod je velmi prostý, když máte číslo 11, neříkáte mu deset jedna
, říkáte mu jedenáct
. Máme-li ale číslo 81, interpretujeme jej jako osmdesát jedna
. Proto je nutné sledovat, jestli v řádu desítek se náhodou nevyskytuje číslo 1, což by signalizovalo, že jde o číslo v rozmezí 10-19. V takovém případě je potřeba sáhnout do alternativního slovníku, který nahradí standardní slovník pro řády desítek:
var slovnik2=new Array(„deset“, „jedenáct“, „dvanáct“, „třináct“, „čtrnáct“, „patnáct“, „šestnáct“, „sedmnáct“, „osmnáct“, „devatenáct“);
Výslednému ASP kódu můžete takto předat jako parametr číselné označení a on vám velmi obratně a rychle vrátí jeho textové vyjádření. Záleží pouze na vás, jak velký slovník si vytvoříte a jak velká čísla budete schopni převádět. Pozornější jistě přijdou na skutečnost, že převod větších čísel bude znamenat obohacení celého cyklu průchodu o další podmínku, ovšem tu již nechávám na vás. Navíc, kolik z nás posílá denně poštou více než milión?
Pro zjednodušení, abych vás nenutil vše opisovat, zde najdete soubor se zdrojovým kódem pro ASP.
Starší komentáře ke článku
Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.
Mohlo by vás také zajímat
-
Jak zabezpečit váš chytrý telefon před kybernetickými hrozbami
30. listopadu 2023
Nejnovější
-
Výkonný a kompaktní: ASOME Max Studio s výjimečným poměrem cena/výkon
11. listopadu 2024 -
Šokující data od Microsoftu: Kyberútoky rostou o stovky procent!
8. listopadu 2024 -
Chcete jedinečnou doménu? Objevte koncovky FOOD, MEME a MUSIC!
7. listopadu 2024 -
OpenAI představilo novou funkci ChatGPT Search
6. listopadu 2024
Hynek Černoch
Pro 20, 2013 v 15:28Nejvážnější chyby:
21000 = „dvacettisíc“ (krade peníze)
12000 = „desetdvatisíce“ (není ani trochu česky)