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
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
I più letti di oggi
- Effettuare il multi-checkout in linea nelle pipeline di Azure DevOps
- Le DirectInk API nella Universal Windows Platform
- Alleggerire le applicazioni WPF sfruttando gli oggetti Freezable
- Sfruttare una CDN con i bundle di ASP.NET
- Esaminare documenti XML con namespace utilizzando LINQ to XML
- Gli oggetti CallOut di Expression Blend 4.0
- Effetto turnstile su tutte le pagine con il Windows Phone Toolkit


