Když osm není osm: Pozor na vyhodnocování čísel v JavaScriptu

Představte si, že ošetříte pole ve formuláři na webové stránce pomocí JavaScriptu tak, aby uživatel musel zadat celé číslo větší než nula. Jako příklad si můžeme vzít třeba pole pro zadání měsíce (1–12). Abyste uživateli ušetřili práci, vyhodnotíte vložený údaj pomocí parseInt() a pokud bude hodnota mimo zadaný interval, nedovolíte formulář odeslat. Jde o jednoduchou funkci, každý ji bez problémů dokáže napsat, při testech vše funguje tak jak má, až při předání zákazníkovi se začnou množit stížnosti na to, že nelze odeslat formulář, i když je všechno vyplněné správně.

Možná příčina je ve funkci parseInt. Schválně, zkuste si tipnout, co v JavaScriptu vypíše následující kód:

function test(x) {
    document.write("'" + x + "' = ");
    document.write(parseInt(x));
    document.write("

");
}
test("01");
test("02");
test("07");
test("08");
test("09");

Možná vás to překvapí (i když by nemělo!), ale výsledek bude vypadat takto:

'01' = 1
'02' = 2
'07' = 7
'08' = 0
'09' = 0

(Můžete si otestovat)

Stačí pak, aby uživatel do pole pro měsíc nezadal „8“, ale „08“, a bude chováním velmi překvapen (navíc když mu zadání „07“ prošlo bez problémů…) Příčina je, jak už jistě tušíte, v tom, že JS parser používá syntaxi čísel z C, kde číslo, které začíná znakem „0“, je zapsáno v osmičkové soustavě.

Jak se vyhnout podobným problémům, a to rovnou několika různými způsoby, ukazuje Thomas Fuchs v článku Adventures in JavaScript number parsing.

Začal programovat v roce 1984 s programovatelnou kalkulačkou. Pokračoval k BASICu, assembleru Z80, Forthu, Pascalu, Céčku, dalším assemblerům, před časem v PHP a teď by rád neprogramoval a radši se věnoval starým počítačům.

Komentáře: 6

Přehled komentářů

kkl2401 Upřesnění
spud Upresneni 2
šachy Re: Upresneni 2
ijacek Re: Upresneni 2
DevelX parseInt
100% Lenin Re: parseInt
Zdroj: https://www.zdrojak.cz/?p=1256