[ mladenmp @ 02.04.2009. 00:32 ] @
Treba mi pomoc oko sledeceg problema. Treba da napisem javascript za validaciju tekstualnih polja.

Tekstualna polja treba da prime podatke broju indeksa (koji treba da je oblika dd/dddd, na primjer 12/2004, gdje godina treba da bude veća od 1979 a manja ili jednaka od tekuće godine) i prosječnoj ocjeni studenta (realan broj sa 2 decimale iz intervala [5,10]).

Svaka pomoc bi mi izuzetno koristila jer sam pocetnik.
[ Nikola Poša @ 02.04.2009. 10:12 ] @
Evo napisao sam na brzinu f-ju za validaciju indeksa u tom formatu, pa ti probaj:
Code:

function validacija_indeksa(br_indeksa) {
    if (br_indeksa.indexOf('/') == -1) {
        return false;
    }
    
    br_god = br_indeksa.split('/');
    
    if (br_god[0].length != 2 || br_god[1].length != 4) {
        return false;
    }
    
    if (br_god[0].charAt(0) < '0' || br_god[0].charAt(0) > '9' || br_god[0].charAt(1) < '0' || br_god[0].charAt(1) > '9') {
        return false;
    }
    
    godina = parseInt(br_god[1]);
    if (godina == 'NaN') {
        return false;
    }
    else {
        var dt = new Date();
        if (godina < 1979 ||  godina > dt.getFullYear()) {
            return false;
        }
    }
    
    return true;
    
}

A mogao bi da je testiraš npr. ovako:
Code:

function provera() {
    var br_indeksa = document.getElementById('indeks').value;
    
    if (!validacija_indeksa(br_indeksa)) {
        alert('Uneti broj indeksa nije validan.');
    }
    else {
        alert('Ok');
    }
}

Samo naravno pre toga napravi neko tekstualno polje sa id-em indeks i neko dugme koje ima onclick = "provera();".

Elem, kod mene na faksu format indeksa je ddd/dd (npr. 100/09).

E aj' sad ti probaj sam ovo za prosečnu ocenu studenta.

P.S. Ova f-ja je verovatno mogla da se zameni sa nekim regularnim izrazom, samo ja ne znam kako bi se onda godina ograničavala na taj opseg od 1979 do 2009, odnosno, do trenutne godine.

P.P.S. Ako ovo radiš samo zbog nekog domaćeg zadatka ili seminarskog, nebitno, onda ok, ali u realnim uslovima, nemoj nikad da se oslanjaš na validaciju na klijentskoj strani.

[Ovu poruku je menjao Nikola Poša dana 02.04.2009. u 11:23 GMT+1]
[ Nikola Poša @ 02.04.2009. 12:04 ] @
Evo ipak ja da ti napišem i tu drugu f-ju za prosek:
Code:

function validacija_proseka(prosek) {
    if (prosek.length > 4) {
        return false;
    }
    
    for (var i = 0; i < prosek.length; i++) {
        if (prosek.charAt(i) < '0' && prosek.charAt(i) > '9' && prosek.charAt(i) != '.' && prosek.charAt(i) != ',') {
            return false;
        }
    }
    
    if ((prosek.indexOf('.') != -1 || prosek.indexOf(',') != -1) && (prosek.indexOf('.') != prosek.lastIndexOf('.') || prosek.indexOf(',') != prosek.lastIndexOf(','))) {
        return false;
    }
    
    if (prosek.charAt(prosek.length - 1) == '.' || prosek.charAt(prosek.length - 1) == ',') {
        return false;
    }
    
    broj = parseFloat(prosek);
    
    if (isNaN(broj)) {
        return false;
    }
    
    if (broj < 5 || broj > 10) {
        return false;
    }
    
    return true;
}

Uzeo sam u obzir da ta decimala može da bude ili '.' ili ',', pa zato imam te dugačke if-ove.
[ Nikola Poša @ 02.04.2009. 17:56 ] @
U stvari, evo ovo su bolja rešenja, al' njih namerno nisam hteo odma' da pošaljem da te ne bih zbunio sa regularnim izrazima:

Validacija broja indeksa:
Code:

function validacija_indeksa(br_indeksa) {
    var pattern = /^[0-9]{2}\/[0-9]{4}$/;
    var dt = new Date();
    var godina = parseInt(br_indeksa.substr(-4));
    
    if (pattern.test(br_indeksa) && godina >= 1979 && godina <= dt.getFullYear()) {
        return true;
    }
    else {
        return false;
    }
}

Validacija prosečne ocene:
Code:

function validacija_proseka(prosek) {
    var pattern = /^[5-9]([\.\,][0-9]{2})?$/;
    
    if (pattern.test(prosek) ||  prosek == '10') {
        return true;
    }
    else {
        return false;
    }
}

Kraće, jednostavnije, čitljivije...
[ Aleksandar Ružičić @ 02.04.2009. 21:35 ] @
Citat:
Nikola Poša:Kraće, jednostavnije, čitljivije... :)

i ne bas 100% ispravno :)

za prvi deo ces imati problema sa internet explorerom, koji bas ne voli negativni index u substr, ovo je sigurnije:
Code:

var godina = parseInt(br_indeksa.substr(3));


inace, evo one-linera za taj problem (mada je ipak preglednije u vise linija):
Code:

function validateIndex(index) {
   return index.match(/^\d{2}\/(\d{4})$/) && (RegExp.$1 << 0 >= 1979) && (RegExp.$1 << 0 <= (new Date).getFullYear());
}
[ mladenmp @ 03.04.2009. 00:44 ] @
Veliko HVALA Nikoli, i naravno Aleksandru.

Napomenuo sam da sam pocetnik a NIkolina rijesenja su mi pomogla da shvatim kako u buduce da radim
sa javascriptom.

Hvala i za regularne izraze koji su mnogo prakticniji.

Interesuje me gdje mogu da nadjem nesto vise o regularnim izrazima?

Jos jednom veliko hvala.
[ Nikola Poša @ 03.04.2009. 15:36 ] @
Nema na čemu.

Što se tiče regularnih izraza, ne bih znao tačno da te usmerim na određeni sajt. Google-aj, tako je najbolje.
[ Aleksandar Ružičić @ 03.04.2009. 18:37 ] @
sto se tice RE, http://www.regular-expressions.info/ moze biti dobro mesto za pocetak