Function IsCodiceFiscaleValido(ByVal codiceFiscale As String) As Boolean
' ---------------------------------------------------------------------
' Basato sul codice trovato qui:
' http://blogs.dotnethell.it/imaginsystems/VB.NET-FUNZIONE-CHE-CALCOLA-IL-CODICE-DI-CONTROLLO-DEL-CODICE-FISCALE-VALIDARE-IL-CODICE-FISCALE__18441.aspx
' ---------------------------------------------------------------------
Dim ArrayCharPosizioneDispari() As Integer = {1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20, 11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23}
Dim ArrayChar() As String = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"}
Dim ArrayPari As New ArrayList
Dim ArrayDispari As New ArrayList
Dim risultato As Integer = 0
Dim sommapari As Integer = 0
Dim sommadispari As Integer = 0
Try
If codiceFiscale.ToString <> "" Then
For i As Integer = 0 To codiceFiscale.Length - 2 Step 1
'Vi ricordo che l'array parte da zero ma noi dobbiamo calcolare come se fosse 1
'e quindi Dispari si trovano nella posizione Pari e i Pari si trovano nella posizione Dispari
If i Mod (2) = 1 Then
'Indice Dispari - Posizione Dispari)
ArrayPari.Add(codiceFiscale.Substring(i, 1).ToString)
Else
'Indice Pari - Posizione Pari
ArrayDispari.Add(codiceFiscale.Substring(i, 1).ToString)
End If
Next
For i As Integer = 0 To ArrayPari.Count - 1 Step 1
If IsNumeric(ArrayPari(i).ToString) Then
sommapari = sommapari + CInt(ArrayPari(i).ToString)
'Console.WriteLine(ArrayPari(i).ToString & " ArrayPari(" & i & ").ToString = " & ArrayPari(i).ToString)
Else
For j As Integer = 0 To ArrayChar.Length - 1 Step 1
If (UCase(ArrayPari(i).ToString) = ArrayChar(j).ToString) Then
sommapari = sommapari + j
'Console.WriteLine(ArrayPari(i).ToString & " ArrayPari(" & i & ").ToString = " & j)
Exit For
End If
Next
End If
Next
For i As Integer = 0 To ArrayDispari.Count - 1 Step 1
If IsNumeric(ArrayDispari(i).ToString) Then
sommadispari = sommadispari + CInt(ArrayCharPosizioneDispari(CInt(ArrayDispari(i).ToString)).ToString)
'Console.WriteLine(ArrayDispari(i).ToString & " ArrayDispari(" & i & ").ToString = " & ArrayCharPosizioneDispari(ArrayDispari(i).ToString).ToString)
Else
For j As Integer = 0 To ArrayChar.Length - 1 Step 1
If (UCase(ArrayDispari(i).ToString) = ArrayChar(j).ToString) Then
sommadispari = sommadispari + CInt(ArrayCharPosizioneDispari(j).ToString)
'Console.WriteLine(ArrayDispari(i).ToString & " ArrayCharPosizioneDispari(" & j & ").ToString = " & ArrayCharPosizioneDispari(j).ToString)
Exit For
End If
Next
End If
Next
End If
risultato = 0
ArrayPari.Clear()
ArrayDispari.Clear()
risultato = (sommapari + sommadispari) Mod 26 'Restituisce il Resto con il comando Mod
'Console.WriteLine(ArrayChar(risultato).ToString & " = " & CodiceFiscale.Substring(CodiceFiscale.Length - 1, 1).ToString)
'Controllo che la lettera che si trova nella posizione risultato o resto corrisponde a l'ultima lettera del codice fiscale passato
If (ArrayChar(risultato).ToString = UCase(codiceFiscale.Substring(codiceFiscale.Length - 1, 1).ToString)) Then
Return True
Else
Return False
End If
Catch ex As Exception
'Errore generato da qualche numero e carattere strano
Return False
End Try
End Function
La mia versione (con Option Strict On e con le variabili locali) è basata sul codice trovato qui.
Altre info: cos'è il Codice Fiscale e come si calcola.