PDA

Visualizza la versione completa : Problema con JS controllo codice fiscale


Xion Aritel
10-01-2006, 15:16
Salve a tutti!

La funzione è questa:



function Check_Cod_Fisc(Cod_Fisc)
{


var strcognome
strcognome=""


// Processa il cognome
//----------------------------------------------------------------
for (i=0; i<document.MioForm.Cognome.value.length; i++)
{
switch (document.MioForm.Cognome.value.charAt(i))
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': break;
default :
if((document.MioForm.Cognome.value.charAt(i)<='Z')&& (document.MioForm.Cognome.value.charAt(i)>'A')) {
strcognome = strcognome + document.MioForm.Cognome.value.charAt(i); }
}
}
if (strcognome.length < 3)
{
for (i=0; i<document.MioForm.Cognome.value.length; i++)
{
switch (document.MioForm.Cognome.value.charAt(i))
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': strcognome = strcognome + document.MioForm.Cognome.value.charAt(i);
}
}

if (strcognome.length < 3)
{
for (i=strcognome.length; i<=3; i++)
{ strcognome = strcognome + 'X'; }
}
}

strcognome = strcognome.substring(0,3);
//------------------------------------------------------------


var strnome
strnome=""
// processa il nome
//----------------------------------------------------------------

for (i=0; i<document.MioForm.Nome.value.length; i++)
{
switch (document.MioForm.Nome.value.charAt(i))
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': break;
default:
if((document.MioForm.Nome.value.charAt(i)<='Z')&& (document.MioForm.Nome.value.charAt(i)>'A')) {
strnome = strnome + document.MioForm.Nome.value.charAt(i); }
}
}

if (strnome.length > 3)
{
strnome = strnome.substring(0,1) + strnome.substring(2,4);
}
else {
if (strnome.length < 3)
{
for (i=0; i<document.MioForm.Nome.value.length; i++)
{
switch (document.MioForm.Nome.value.charAt(i))
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': strnome = strnome + document.MioForm.Nome.value.charAt(i);
}
}

if (strnome.length < 3)
{
for (i=strnome.length; i<=3; i++)
{strnome = strnome + 'X';}
}
}
strnome = strnome.substring(0,3);
}

var strnc
strnc=strcognome+strnome ;


//--------------------------------------- Fine processa nome




var strCod_Fisc
strCod_Fisc = Cod_Fisc
var somma = 0
var chrcontrollo = ' '
var mycod = " "
mycod = strCod_Fisc
for (i=0; i<15; i++)
{
if (((i+1) % 2) != 0) //caratteri dispari
{
switch (mycod.charAt(i))
{
case '0':
case 'A':{ somma += 1; break;}
case '1':
case 'B':{ somma += 0; break;}
case '2':
case 'C':{ somma += 5; break;}
case '3':
case 'D':{ somma += 7; break;}
case '4':
case 'E':{ somma += 9; break;}
case '5':
case 'F':{ somma += 13; break;}
case '6':
case 'G':{ somma += 15; break;}
case '7':
case 'H':{ somma += 17; break;}
case '8':
case 'I':{ somma += 19; break;}
case '9':
case 'J':{ somma += 21; break;}
case 'K':{ somma += 2; break;}
case 'L':{ somma += 4; break;}
case 'M':{ somma += 18; break;}
case 'N':{ somma += 20; break;}
case 'O':{ somma += 11; break;}
case 'P':{ somma += 3; break;}
case 'Q':{ somma += 6; break;}
case 'R':{ somma += 8; break;}
case 'S':{ somma += 12; break;}
case 'T':{ somma += 14; break;}
case 'U':{ somma += 16; break;}
case 'V':{ somma += 10; break;}
case 'W':{ somma += 22; break;}
case 'X':{ somma += 25; break;}
case 'Y':{ somma += 24; break;}
case 'Z':{ somma += 23; break;}
}
}
else //caratteri pari
{
switch (mycod.charAt(i))
{
case '0':
case 'A':{ somma += 0; break;}
case '1':
case 'B':{ somma += 1; break;}
case '2':
case 'C':{ somma += 2; break;}
case '3':
case 'D':{ somma += 3; break;}
case '4':
case 'E':{ somma += 4; break;}
case '5':
case 'F':{ somma += 5; break;}
case '6':
case 'G':{ somma += 6; break;}
case '7':
case 'H':{ somma += 7; break;}
case '8':
case 'I':{ somma += 8; break;}
case '9':
case 'J':{ somma += 9; break;}
case 'K':{ somma += 10; break;}
case 'L':{ somma += 11; break;}
case 'M':{ somma += 12; break;}
case 'N':{ somma += 13; break;}
case 'O':{ somma += 14; break;}
case 'P':{ somma += 15; break;}
case 'Q':{ somma += 16; break;}
case 'R':{ somma += 17; break;}
case 'S':{ somma += 18; break;}
case 'T':{ somma += 19; break;}
case 'U':{ somma += 20; break;}
case 'V':{ somma += 21; break;}
case 'W':{ somma += 22; break;}
case 'X':{ somma += 23; break;}
case 'Y':{ somma += 24; break;}
case 'Z':{ somma += 25; break;}
}
}
}

somma %= 26;
switch (somma)
{
case 0: {chrcontrollo='A'; break;}
case 1: {chrcontrollo='B'; break;}
case 2: {chrcontrollo='C'; break;}
case 3: {chrcontrollo='D'; break;}
case 4: {chrcontrollo='E'; break;}
case 5: {chrcontrollo='F'; break;}
case 6: {chrcontrollo='G'; break;}
case 7: {chrcontrollo='H'; break;}
case 8: {chrcontrollo='I'; break;}
case 9: {chrcontrollo='J'; break;}
case 10: {chrcontrollo='K'; break;}
case 11: {chrcontrollo='L'; break;}
case 12: {chrcontrollo='M'; break;}
case 13: {chrcontrollo='N'; break;}
case 14: {chrcontrollo='O'; break;}
case 15: {chrcontrollo='P'; break;}
case 16: {chrcontrollo='Q'; break;}
case 17: {chrcontrollo='R'; break;}
case 18: {chrcontrollo='S'; break;}
case 19: {chrcontrollo='T'; break;}
case 20: {chrcontrollo='U'; break;}
case 21: {chrcontrollo='V'; break;}
case 22: {chrcontrollo='W'; break;}
case 23: {chrcontrollo='X'; break;}
case 24: {chrcontrollo='Y'; break;}
case 25: {chrcontrollo='Z'; break;}
}

//--------------------------------------------

if (chrcontrollo == mycod.charAt(15)&&(Cod_Fisc.substring(0,6)==strnc))
{

return true;
}
else
{

alert("Codice Fiscale non valido");
// Cod_Fisc.focus();
return false;
}
}


La funzione la chiamo da qui:




<td>
<input type="text" name="CodFisc" maxlength=16 value="" onBlur="if (this.value.length!=0 || this.value!=''){Check_Cod_Fiscale(this.value); return true}">
</td>



L'errore che mi salta fuori è "previsto oggetto".
Sapete aiutarmi a capire perchè?

Domandina (da completo newbie del JS):
il messaggio di errore mi specifica un numero di riga ed un carattere, cosa che (penso) dovrebbe aiutarmi a risolvere più facilmente i problemi. Come vengono calcolate, però, le righe?
Cioè, si conta solo il codice client-side (penso di sì)? Si considerano solo le righe scritte o anche quelle che contengono solo spazi vuoti? Ho provato ad andare alla riga specificata, ma non c'ho trovato niente di strano... :bhò:

Grazie in anticipo a tutti!

EDIT:
Il controllo del codice fiscale lo eseguo solo sul nome e sul cognome perchè solo questi dati ho a disposizione... sempre meglio che non controllarlo affatto...

Xion Aritel
10-01-2006, 16:20
Uppino...
:D

br1
10-01-2006, 16:21
La funzione si chiama Check_Cod_Fisc e tu invece richiami Check_Cod_Fiscale :madai!?:

Inoltre hai dato lo stesso nome del parametro della funzione al campo del form : CodFisc :nonono: devono essere univoci

ciao

Xion Aritel
10-01-2006, 16:39
Originariamente inviato da br1
La funzione si chiama Check_Cod_Fisc e tu invece richiami Check_Cod_Fiscale :madai!?:


Azz...
Denghiu :D


Originariamente inviato da br1
Inoltre hai dato lo stesso nome del parametro della funzione al campo del form : CodFisc :nonono: devono essere univoci

ciao

No, CodFisc è solo il nome del campo, il parametro è Cod_Fisc...
Ovviamente cambiando il nome la funzione viene eseguita senza problemi, anche se non pare funzionare a dovere (non riconosce come valido il mio codice fiscale... mah).

Per favore, puoi anche rispondermi alla domanda sul messaggio d'errore?
Mi potrebbe essere molto utile per avitare di rompere sempre le scatole qui :D

Xion Aritel
10-01-2006, 17:44
Fatto qualche modifica, ma ottengo un errore differente da prima:

'undefined' è nullo o non è un oggetto

La funzione è adesso questa:




function Check_Cod_Fiscale(Cod_Fisc)
{
strcognome=""

// Processa il cognome
//----------------------------------------------------------------
for (i=0; i<document.MioForm.Cognome.value.length; i++)
{
switch (document.MioForm.Cognome.value.charAt(i))
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': break;
default :
if((document.MioForm.Cognome.value.charAt(i)<='Z')&& (document.MioForm.Cognome.value.charAt(i)>'A')) {
strcognome = strcognome + document.MioForm.Cognome.value.charAt(i); }
}
}
if (strcognome.length < 3)
{
for (i=0; i<document.MioForm.Cognome.value.length; i++)
{
switch (document.MioForm.Cognome.value.charAt(i))
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': strcognome = strcognome + document.MioForm.Cognome.value.charAt(i);
}
}
if (strcognome.length < 3)
{
for (i=strcognome.length; i<=3; i++)
{ strcognome = strcognome + 'X'; }
}
}

strcognome = strcognome.substring(0,3);
//------------------------------------------------------------
//alert(strcognome);

strnome=""
// processa il nome
//----------------------------------------------------------------
for (i=0; i<document.MioForm.Nome.value.length; i++)
{
switch (document.MioForm.Nome.value.charAt(i))
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': break;
default:
if((document.MioForm.Nome.value.charAt(i)<='Z')&& (document.MioForm.Nome.value.charAt(i)>'A')) {
strnome = strnome + document.MioForm.Nome.value.charAt(i); }
}
}
if (strnome.length > 3)
{
strnome = strnome.substring(0,1) + strnome.substring(2,4);
}
else {
if (strnome.length < 3)
{
for (i=0; i<document.MioForm.Nome.value.length; i++)
{
switch (document.MioForm.Nome.value.charAt(i))
{
case 'A':
case 'E':
case 'I':
case 'O':
case 'U': strnome = strnome + document.MioForm.Nome.value.charAt(i);
}
}
if (strnome.length < 3)
{
for (i=strnome.length; i<=3; i++)
{strnome = strnome + 'X';}
}
}
strnome = strnome.substring(0,3);
}
//alert(strnome);
strnc=strcognome+strnome ;


//--------------------------------------- Fine processa nome




strCod_Fisc = Cod_Fisc.value
var somma = 0
var chrcontrollo = ' '
var mycod = " "
mycod = strCod_Fisc
for (i=0; i<15; i++)
{
if (((i+1) % 2) != 0) //caratteri dispari
{
switch (mycod.charAt(i))
{
case '0':
case 'A':{ somma += 1; break;}
case '1':
case 'B':{ somma += 0; break;}
case '2':
case 'C':{ somma += 5; break;}
case '3':
case 'D':{ somma += 7; break;}
case '4':
case 'E':{ somma += 9; break;}
case '5':
case 'F':{ somma += 13; break;}
case '6':
case 'G':{ somma += 15; break;}
case '7':
case 'H':{ somma += 17; break;}
case '8':
case 'I':{ somma += 19; break;}
case '9':
case 'J':{ somma += 21; break;}
case 'K':{ somma += 2; break;}
case 'L':{ somma += 4; break;}
case 'M':{ somma += 18; break;}
case 'N':{ somma += 20; break;}
case 'O':{ somma += 11; break;}
case 'P':{ somma += 3; break;}
case 'Q':{ somma += 6; break;}
case 'R':{ somma += 8; break;}
case 'S':{ somma += 12; break;}
case 'T':{ somma += 14; break;}
case 'U':{ somma += 16; break;}
case 'V':{ somma += 10; break;}
case 'W':{ somma += 22; break;}
case 'X':{ somma += 25; break;}
case 'Y':{ somma += 24; break;}
case 'Z':{ somma += 23; break;}
}
}
else //caratteri pari
{
switch (mycod.charAt(i))
{
case '0':
case 'A':{ somma += 0; break;}
case '1':
case 'B':{ somma += 1; break;}
case '2':
case 'C':{ somma += 2; break;}
case '3':
case 'D':{ somma += 3; break;}
case '4':
case 'E':{ somma += 4; break;}
case '5':
case 'F':{ somma += 5; break;}
case '6':
case 'G':{ somma += 6; break;}
case '7':
case 'H':{ somma += 7; break;}
case '8':
case 'I':{ somma += 8; break;}
case '9':
case 'J':{ somma += 9; break;}
case 'K':{ somma += 10; break;}
case 'L':{ somma += 11; break;}
case 'M':{ somma += 12; break;}
case 'N':{ somma += 13; break;}
case 'O':{ somma += 14; break;}
case 'P':{ somma += 15; break;}
case 'Q':{ somma += 16; break;}
case 'R':{ somma += 17; break;}
case 'S':{ somma += 18; break;}
case 'T':{ somma += 19; break;}
case 'U':{ somma += 20; break;}
case 'V':{ somma += 21; break;}
case 'W':{ somma += 22; break;}
case 'X':{ somma += 23; break;}
case 'Y':{ somma += 24; break;}
case 'Z':{ somma += 25; break;}
}
}
}
somma %= 26;
//alert("somma--->"+somma);
switch (somma)
{
case 0: {chrcontrollo='A'; break;}
case 1: {chrcontrollo='B'; break;}
case 2: {chrcontrollo='C'; break;}
case 3: {chrcontrollo='D'; break;}
case 4: {chrcontrollo='E'; break;}
case 5: {chrcontrollo='F'; break;}
case 6: {chrcontrollo='G'; break;}
case 7: {chrcontrollo='H'; break;}
case 8: {chrcontrollo='I'; break;}
case 9: {chrcontrollo='J'; break;}
case 10: {chrcontrollo='K'; break;}
case 11: {chrcontrollo='L'; break;}
case 12: {chrcontrollo='M'; break;}
case 13: {chrcontrollo='N'; break;}
case 14: {chrcontrollo='O'; break;}
case 15: {chrcontrollo='P'; break;}
case 16: {chrcontrollo='Q'; break;}
case 17: {chrcontrollo='R'; break;}
case 18: {chrcontrollo='S'; break;}
case 19: {chrcontrollo='T'; break;}
case 20: {chrcontrollo='U'; break;}
case 21: {chrcontrollo='V'; break;}
case 22: {chrcontrollo='W'; break;}
case 23: {chrcontrollo='X'; break;}
case 24: {chrcontrollo='Y'; break;}
case 25: {chrcontrollo='Z'; break;}
}

//--------------------------------------------

if (chrcontrollo == mycod.charAt(15)&&(Cod_Fisc.substring(0,6)==strnc)){

return true;
} else {

alert("Codice Fiscale non valido");
// Cod_Fisc.focus();
return false;
}
}



Viene, come prima, chiamata così:




<td>
<input type="text" name="CodFisc" maxlength=16 value="" onBlur="if (this.value.length!=0 || this.value!=''){Check_Cod_Fiscale(this.value); return true}">
</td>



Cosa c'è che non va?

Grazie in anticipo :D

kluster
10-01-2006, 17:59
una domanda,
ma come fai a controllare l'esattezza del codice fiscale senza avere il codice regionale del comune di nascita?

Xion Aritel
10-01-2006, 18:06
Originariamente inviato da kluster
una domanda,
ma come fai a controllare l'esattezza del codice fiscale senza avere il codice regionale del comune di nascita?

Leggere sopra, controllo il codice fiscale con i soli dati a mia disposizione, cioè nome e cognome.
Meglio di niente, no?

kluster
10-01-2006, 18:30
dai un occhiata a questa discussione e vedi tu quale ti sembra il + consono
http://forum.html.it/forum/showthread.php?threadid=461388

Mich_
10-01-2006, 18:37
Ho trovato l'errore (forse).

Alla funzione passi una stringa - la chiamata e`:
Check_Cod_Fiscale(this.value)
mentre all'interno della funzione la usi come oggetto, almeno in un caso:
strCod_Fisc = Cod_Fisc.value

Vedi di controllare l'uso che fai del parametro passato.

---

Un commento sulla domanda di kluster.
Il CF e` una stringa che intrinsecamente validabile: infatti l'ultimo carattere e` un controllo di parita` (come veniva chiamato anni fa) e consiste in una somma pesata di tutti gli altri caratteri.
Per cui se c'e` un errore la somma non si trova e il codce non viene validato.

Per il controllo formale, basta quindi una somma, del tipo che viene eseguita in questo script.

--

Un commento sullo script.
Si puo` realizzare in modo molto piu` compatto, senza tutti quegli switch - usando invece dei vettori ad indice alfanumerico.

Xion Aritel
10-01-2006, 18:56
Originariamente inviato da Mich_
Ho trovato l'errore (forse).

Alla funzione passi una stringa - la chiamata e`:
Check_Cod_Fiscale(this.value)
mentre all'interno della funzione la usi come oggetto, almeno in un caso:
strCod_Fisc = Cod_Fisc.value

Vedi di controllare l'uso che fai del parametro passato.


Grazie infinite, l'errore stava proprio lì :yuppi:



Originariamente inviato da Mich_
---

Un commento sulla domanda di kluster.
Il CF e` una stringa che intrinsecamente validabile: infatti l'ultimo carattere e` un controllo di parita` (come veniva chiamato anni fa) e consiste in una somma pesata di tutti gli altri caratteri.
Per cui se c'e` un errore la somma non si trova e il codce non viene validato.

Per il controllo formale, basta quindi una somma, del tipo che viene eseguita in questo script.


Per un controllo formale, ma senza il controllo sul nome e cognome potrei inserire un codice fiscale valido qualsiasi (anche non appartenente alla persona che mi ha dato nome e cognome) e l'applicazione mi consentirebbe di procedere tranquillamente.
Il carattere di controllo è il controllo sulla validità intrinseca, gli altri caratteri possono essere verificati comparandoli ciascuno con altri dati (nome, cognome, data di nascita, comune nascita).


Originariamente inviato da Mich_
--

Un commento sullo script.
Si puo` realizzare in modo molto piu` compatto, senza tutti quegli switch - usando invece dei vettori ad indice alfanumerico.

Ehm... grazie del consiglio, ma sono un niubbo completo... che diamine sono i vettori ad indice alfanumerico? :master:
Roba tipo gli array? O è roba che si mangia? :bhò:
Se mi sai dare qualche consiglio su come migliorarlo sarò ben lieto di farlo! :D

EDIT: Qualcuno sa rispondermi all'altra domanda che avevo posto?
Ovvero: la riga ed il numero del carattere che mi vengono indicati dal messaggio d'errore JS del browser come sono calcolati? Si considerano o no le righe vuote? Si considera o no il codice lato server (credo di no)? Tutte le volte che provo ad andare a cercare l'errore dove il messaggio me lo segnala ci trovo:
a) niente (riga vuota)
b) un carattere che è decisamente al suo posto
c) un pezzo di codice html

EDIT2:
Lo script non genera più l'errore, ma continua a non riconoscere come valido il mio codice fiscale...

Loading