Převod telefonního čísla na slovo

1. ledna 2003

Jste také jedním ze šťastlivců s nezapamatovatelným telefonním číslem? Pak se vám možná bude hodit jednoduchý skript, s jehož pomocí si ověříte, zda byste nemohli na své vizitky místo složitého „602 397 378“ tisknout třeba elegantní „602 EXPERT“.

Psaní telefonního čísla pomocí písmen využívá toho, že na klávesnicích moderních telefonů jsou jednotlivým číslicím přiřazena písmena. Protože na většinu číslic připadá více než jedno písmeno, lze tímto způsobem z většiny šestimístných číslic (tři čísla předčíslí pro tentokrát neuvažujeme) vytvořit několik set písmenných kombinací. S trochou štěstí tak lze mnohé „obyčejné“ telefonní číslo nahradit profesionálně znějícím aliasem. I když je tento způsob psaní čísel hojně rozšířen spíše na západ od našich hranic, první vlaštovky se už drahnou dobu objevují také u nás.

Ve formuláři příkladu zadejte své telefonní číslo a stiskněte tlačítko „Vypsat možnosti“. Všechny dostupné písmenné varianty vašeho telefonního čísla se zobrazí v dalším textovém poli.

Kód použitý v příkladu

Základem výše uvedeného miniprográmku je jednoduchý formulář, který obsahuje jedno vstupní pole, jedno tlačítko a výstupní „textarea“ pole. HTML kód formuláře (z nějž byly pro jednoduchost vypuštěny formátovací tagy tabulky) může vypadat třeba takto:

<form name=“Form1″>
    <input maxLength=“6″ size=“6″ name=“input“>
    <input onclick=“compute(this.form)“ type=“button“ value=“Vypsat možnosti“>
    <textarea name=“TextArea1″ rows=“15″ cols=“25″></textarea>
</form>

Po stisku formulářového tlačítka je volána funkce compute, která nejprve zkontroluje platnost vstupu a poté vygeneruje všechny možné písmenné varianty telefonního čísla. Její kód si ovšem ukážeme až nakonec, nejprve je třeba nadefinovat některé pomocné proměnné a funkce.

Pomocné proměnné jsou čtyři. Proměnná fLeft slouží při vypisování již hotových variant do textového pole a indikuje, zda výpis probíhá v levém nebo pravém sloupci. Do řetězcové proměnné nn je generován vlastní seznam všech jmen, proměnná cnt obsahuje celkový počet těchto jmen. Nejzajímavější je proměnná dd, která je vlastně jednorozměrným polem řetězců, přičemž řetězec na pozici X obsahuje všechna písmena, jež jsou variantami pro číslici X:

var dd = [ „0“, „1“, „ABC“, „DEF“, „GHI“, „JKL“, „MNO“, „PQRS“, „TUV“, „WXYZ“ ];
var nn;
var cnt;
var fLeft=true;

Hlavní práci při výpisu dostupných variant odvede funkce Translate. Aby nebylo třeba procházet polem dd v několika zanořených smyčkách a pracně hlídat několik indexů, je funkce napsaná jako rekurzivní. Jak už to u rekurzivních funkcí bývá, popis chování funkce je několikanásobně složitější než funkce samotná. Ze zdrojového kódu by nicméně její chování mělo být dostatečně zřejmé:

function Translate( inStr, toStr ) {
    if( inStr.length > 0 ) {
        var a = 1 * inStr.substring(0,1);
        var i;
        for( i=0; i<dd[a].length; i++ ) {
            Translate(inStr.substring(1), toStr + dd[a].substring(i,i+1));
        }
    } else {
        nn += toStr + (fLeft ? “ “ : „\n“);
        fLeft = !fLeft;
        cnt += 1;
    }
}

Zbývá už jen maličkost, totiž kód již dříve zmíněné funkce compute. Jejím úkolem je kontrola vstupu, inicializace pomocných proměnných, volání funkce Translate a nakonec přepis výsledku do příslušného formulářového pole:

function compute(form) {
    var txt = form.input.value;
    if (txt.length!=6 || isNaN(txt)) {
        alert („Zadané číslo musí obsahovat 6 číslic.“);
        form.input.select();
        form.input.focus();
        form.TextArea1.value = „Špatný vstup…“
        return;
    }
    nn=““;  cnt = 0;
    Translate( txt, „“ );
    form.TextArea1.value = „Číslo: “ + txt + „\n\n“ + nn + „\nCelkem: “ + cnt + “ možností“;
}

Pro zájemce je celý zdrojový kód příkladu k dispozici. Přeji hodně štěstí při hledání aliasu.

Starší komentáře ke článku

Pokud máte zájem o starší komentáře k tomuto článku, naleznete je zde.

Štítky: Články

Mohlo by vás také zajímat

Nejnovější

Napsat komentář

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