01 July 2016

VB.Net - Calcolare il codice di controllo del Codice Fiscale (validare il Codice Fiscale)

Funzione che serve per Validare un Codice Fiscale e quindi quella che calcola il codice di controllo del Codice Fiscale.

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.