Převod čísla na slovní vyjádření

22. dubna 2003

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.

Rozklad čísla 10 758 na řády

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.

Předchozí článek obecvelka.cz
Štítky: Články

Mohlo by vás také zajímat

Nejnovější

1 komentář

  1. Hynek Černoch

    Pro 20, 2013 v 15:28

    Nejvážnější chyby:

    21000 = „dvacettisíc“ (krade peníze)

    12000 = „desetdvatisíce“ (není ani trochu česky)

    Odpovědět

Napsat komentář: Hynek Černoch Zrušit odpověď na komentář

Vaše e-mailová adresa nebude zveřejněna. Vyžadované informace jsou označeny *