Verifica la validità di un codice fiscale

di Filippo Bonanni, in Classic ASP, UserScript, Scripting,

Per verificare velocemente un codice fiscale, si può ricorrere all'ultimo carattere dello stesso, chiamato Carattere di Controllo.
Tale carattere corrisponde al Resto della divisione per 26 della somma dei valori dei caratteri in posizione pari sommato alla somma dei valori dei caratteri in posizione dispari.
I valori dei caratteri vengono rilevati dalla Tabella di corrispondenza, nel nostro esempio la matrice Lettere, che contiene nella prima colonna le lettere dell'alfabeto e i numeri, nella seconda il loro valore se sono in posizione pari e nella terza il loro valore se sono in posizione dispari.
Il funzionamento è semplice: dopo aver sommato i corrispettivi valori dei 15 caratteri relativi ai dati dell'utente(Nome, Cognome, sesso, anno e luogo di nascita), divido il risultato per 26, ottenendo così un resto che sarà sempre compreso tra 0 e 25. In questo modo al valore del resto, posso associare una lettera dell'alfabeto inglese (0=A, 1=B, ...) ottenendo così il sedicesimo carattere del Codice Fiscale.

Tengo a precisare che in realtà non si ha l'assoluta certezza dell'esattezza ma per avere quella dovremmo prendere
tutto il database dei comuni italiani per avere tutti i codici e ricrearci il Cod. Fisc. per intero, partendo
dai dati forniti dall'utente e dalle istruzioni del ministero della finanza.
Non si ha l'assoluta certezza dell'estattezza perché esistono quelle che i matematici (e non solo loro) chiamano permutazioni: per farla breve, se io scambio tra di loro due lettere che hanno la stessa posizione (o entrambe pari, o entrambe dispari) il risultato della somma non cambia e quindi il Cod.Fisc. risulta corretto.
Ad esempio PLLFBO può diventare LLPFBO avendo scambiato la prima e terza lettera e poi ancora LFPLBO e poi LFPOBL.
Un miglioramento del codice può essere l'aggiunta dell'algoritmo che partendo dal nome e cognome, calcola anche le prime 6 lettere e le confronta con quelle del Cod. Fisc. inserito.

<% 
CodiceFiscale = 'valorizzare qui

Dim Lettere(35,2)

Dim ConfrontoCarattereControllo(25)

Dim I
Dim J

Dim Carattere
Dim ValorePari
Dim ValoreDispari
Dim SommaCaratteri
Dim PariDispari
Dim Risultato

Dim CarattereControllo
Dim Temp
Dim Test

Lettere(0,0) = "A"
Lettere(0,1) = "0"
Lettere(0,2) = "1"

Lettere(1,0) = "B"
Lettere(1,1) = "1"
Lettere(1,2) = "0"

Lettere(2,0) = "C"
Lettere(2,1) = "2"
Lettere(2,2) = "5"

Lettere(3,0) = "D"
Lettere(3,1) = "3"
Lettere(3,2) = "7"

Lettere(4,0) = "E"
Lettere(4,1) = "4"
Lettere(4,2) = "9"

Lettere(5,0) = "F"
Lettere(5,1) = "5"
Lettere(5,2) = "13"

Lettere(6,0) = "G"
Lettere(6,1) = "6"
Lettere(6,2) = "15"

Lettere(7,0) = "H"
Lettere(7,1) = "7"
Lettere(7,2) = "17"

Lettere(8,0) = "I"
Lettere(8,1) = "8"
Lettere(8,2) = "19"

Lettere(9,0) = "J"
Lettere(9,1) = "9"
Lettere(9,2) = "21"

Lettere(10,0) = "K"
Lettere(10,1) = "10"
Lettere(10,2) = "2"

Lettere(11,0) = "L"
Lettere(11,1) = "11"
Lettere(11,2) = "4"

Lettere(12,0) = "M"
Lettere(12,1) = "12"
Lettere(12,2) = "18"

Lettere(13,0) = "N"
Lettere(13,1) = "13"
Lettere(13,2) = "20"

Lettere(14,0) = "O"
Lettere(14,1) = "14"
Lettere(14,2) = "11"

Lettere(15,0) = "P"
Lettere(15,1) = "15"
Lettere(15,2) = "3"

Lettere(16,0) = "Q"
Lettere(16,1) = "16"
Lettere(16,2) = "6"

Lettere(17,0) = "R"
Lettere(17,1) = "17"
Lettere(17,2) = "8"

Lettere(18,0) = "S"
Lettere(18,1) = "18"
Lettere(18,2) = "12"

Lettere(19,0) = "T"
Lettere(19,1) = "19"
Lettere(19,2) = "14"

Lettere(20,0) = "U"
Lettere(20,1) = "20"
Lettere(20,2) = "16"

Lettere(21,0) = "V"
Lettere(21,1) = "21"
Lettere(21,2) = "10"

Lettere(22,0) = "W"
Lettere(22,1) = "22"
Lettere(22,2) = "22"

Lettere(23,0) = "X"
Lettere(23,1) = "23"
Lettere(23,2) = "25"

Lettere(24,0) = "Y"
Lettere(24,1) = "24"
Lettere(24,2) = "24"

Lettere(25,0) = "Z"
Lettere(25,1) = "25"
Lettere(25,2) = "23"

Lettere(26,0) = "0"
Lettere(26,1) = "0"
Lettere(26,2) = "1"

Lettere(27,0) = "1"
Lettere(27,1) = "1"
Lettere(27,2) = "0"

Lettere(28,0) = "2"
Lettere(28,1) = "2"
Lettere(28,2) = "5"

Lettere(29,0) = "3"
Lettere(29,1) = "3"
Lettere(29,2) = "7"

Lettere(30,0) = "4"
Lettere(30,1) = "4"
Lettere(30,2) = "9"

Lettere(31,0) = "5"
Lettere(31,1) = "5"
Lettere(31,2) = "13"

Lettere(32,0) = "6"
Lettere(32,1) = "6"
Lettere(32,2) = "15"

Lettere(33,0) = "7"
Lettere(33,1) = "7"
Lettere(33,2) = "17"

Lettere(34,0) = "8"
Lettere(34,1) = "8"
Lettere(34,2) = "19"

Lettere(35,0) = "9"
Lettere(35,1) = "9"
Lettere(35,2) = "21"

For I = 0 To 25

    ConfrontoCarattereControllo(I) = Chr(65 + I) 'creo in ConfrontoCarattereControllo tutte le lettere maiuscole dalla A (chr(65)) alla Z(chr(90))

 Next

Carattere=0
ValorePari=1 'indice della seconda colonna della matrice Lettere
ValoreDispari=2 'indice della terza colonna della matrice Lettere
SommaCaratteri=0

CarattereControllo=Right(CodiceFiscale,1)

for I=1 to len(CodiceFiscale)-1
 if (I mod 2)=0 then
  PariDispari="P"
 else
  PariDispari="D"
 end if
 
 Temp =mid(CodiceFiscale,I,1)
 J=0
 do
  Test=Lettere(J,Carattere)
  J=J+1
 loop until Temp=Test
 J=J-1
 
 if PariDispari="P" then
  SommaCaratteri=SommaCaratteri + CInt(Lettere(J,ValorePari))
 else
  SommaCaratteri=SommaCaratteri + CInt(Lettere(J,ValoreDispari))
 end if
Next

Risultato=SommaCaratteri mod 26

Risultato=ConfrontoCarattereControllo(Risultato)

if Risultato<>CarattereControllo then
 Response.write "Si è verificato un errore"
else
 Response.write "CodiceFiscale: " & Risultato
 
end if
%>

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

Nessuna risorsa collegata

I più letti di oggi