Spiegazione del significato di ogni singola lettera/cifra del Codice Fiscale con alcune routine in Visual Basic per testarne la validità.

Il codice fiscale è composto da 16 caratteri di cui 15 portano informazioni il 16esimo è un carattere di controllo sui dati precedenti.

Vediamo un esempio:

Rossi Mario nato il 11/02/1979 Cesano Maderno (MI), il codice fiscale é:
	RSS	MRA	79	B	11	C566	R	
	111	111	00	1	00	1000	1	
La seconda riga va letta in questo modo:
  • un 1 indica la presenza di una lettera in quella posizione
  • uno 0 indica la presenza di un numero in quella posizione
ed é valida per tutti i codici fiscali.

Descrizione (Tabella 1):
  • RSS ricavato dal cognome (solo caratteri)
    per la codifica vedi: Codifica del Cognome
  • MRA ricavato dal nome (solo caratteri)
    per la codifica vedi: Codifica del Nome
  • 79 Ultime due cifre dell’anno di nascita (solo numeri)
  • B Mese di nascita (una lettera) codificato secondo la seguente tabella:
    01 Gennaio A
    02 Febbraio B
    03 Marzo C
    04 Aprile D
    05 Maggio E
    06 Giugno H
    07 Luglio L
    08 Agosto M
    09 Settembre P
    10 Ottobre R
    11 Novembre S
    12 Dicembre T
  • 11 Giorno di nascita (solo numerico) a cui va sommato:
    - se di sesso maschile 0
    - se di sesso femminile 40
  • C566 Codice Erariale del comune di nascita, composto da una lettera seguita da tre cifre
    per trovare i codice erariale vedi Cerca comuni italiani
  • R codice di controllo codificato in base ai caratteri precedenti
    (si tratta di una invenzione della IBM degli anni ‘50, chiamata C.I.N.)
    per la codifica vedi: Calcolo del C.I.N.
Compattazione del Cognome

Si valutano tutti i caratteri che compongono il cognome e si scartano tutti gli spazi e gli eventuali simboli come l’apostrofo, ricostruendo così una stringa composta solo da numeri e da caratteri maiuscoli (la stringa risultante deve essere almeno di 2 caratteri).
Scorrendo la nuova stringa carattere per carattere partendo da sinistra e si creano due stringhe così composte: una contenente tutte le consonanti (strcons) e l’altra tutte le vocali (strvoc).
A questo punto uniamo strcons, strvoc e "X", poi prendiamo i primi tre caratteri di questa nuova stringa, abbiamo ottenuto la codifica del cognome.
In altre parole la codifica avviene prendendo le prime tre consonanti presenti nel cognome o se queste dovessero essere meno di tre, si aggiungono le vocali in modo tale da arrivare a un totale di tre caratteri, sempre dando la priorità a quelle più a sinistra spostandosi poi verso destra.
Compattazione del Nome

La compattazione del nome avviene in due fasi successive:
  • la prima, identica alla compattazione del cognome, che chiamiamo codifica parziale
  • la seconda parte dalla codifica parziale per ottenere la codifica finale e verrà descritta qui di seguito
Seconda fase codifica finale

Se strcons risultante è maggiore di tre:
Avviene prendendo il primo carattere di strcons + strvoc (detta anche codifica parziale) aggiungendogli poi due caratteri partendo però dal terzo (ovvero primo, terzo e quarto carattere) il risultato è la codifica del nome (non so perché e stata aggiunta questa seconda fase, prendiamola per buona).

N.B. Sia il nome che il cognome devono avere un minimo di 2 caratteri.
Compattazione finale del Cognome e del Nome

Si effettua utilizzando la sequenza di seguito indicata:

codif. finale del cognome + codif. finale del nome + strvoc dalla codifica del nome + "X"

prendendo da questo solo i primi sei caratteri partendo da sinistra.
Calcolo del C.I.N.

Il calcolo del CIN avviene attribuendo valori diversi legati ad ogni cifra e alla posizione da questa occupata nel Codice Fiscale, viene generata univocamente una somma che, divisa per un fattore e moltiplicata per un altro, può essere rappresentata, sotto forma di codice, da una cifra, detta C.I.N.
Vediamo come calcolarlo:
  • Si parte dalla stringa composta da:
    - codice del cognome
    - codice del nome
    - ultime due cifre dell’anno di nascita
    - codifica del mese di nascita
    - giorno di nascita
    - Codice Erariale
  • a questo punto si valuta carattere per carattere:
    - se é una lettera si ricava il codice ASCII e si sottrae 65 (A)
    - e se é una cifra si ricava il codice ASCII e si sottrae 48 (0)
    questo per ricavare sempre un numero compreso tra 0 e 25 (cifra). Controllare inoltre che il carattere o numero trovati siano quelli che ci si aspettava in questa posizione (vedi tabella 1).
  • se si tratta di un carattere in posizione dispari:
    - sommare a CIN il valore ricavato dalla tabella 2, nel seguente modo:
    andare a leggere il valore di cifra nella colonna con la lettera (L) e utilizzare il valore della colonna successiva (V) per sommarlo a totale
  • se si tratta di un carattere in posizione pari:
    - memorizzare nella variabile CIN il valore di cifra
  • ripetere le due frasi precedenti fino al 15esimo carattere
  • applicare la seguente formula a CIN:
    CIN = (CIN - INT(CIN / 26) *26) + 65
    dove INT e una funzione che restituisce il numero privo della parte decimale, mentre 65 e il codice ASCII corrispondente alla lettera ‘A’. CIN restituirà un valore compreso tra 0 e 25 che sommato a 65 darà il codice ASCII di una lettera dell’alfabeto.

Tabella 2
LVLVLVLVLV
A=0001 B=0100 C=0205 D=0307 E=0409
F=0513 G=0615 H=0717 I=0819 J=0921
K=1002 L=1104 M=1218 N=1320 O=1411
P=1503 Q=1606 R=1708 S=1812 T1914
U=2016 V=2110 W=22 22 X=2325 Y=2424
Z=2523 -- -- -- --
Programmi di esempio per il calcolo del CIN

'Dove cf è una stringa contenente i primi 15 caratteri del codice fiscale da controllare 
Function CalcolaCIN (cf As String) As String
    
    Dim cin As Integer, i As Integer, alterna As Integer, car As Integer
    Dim num  As String * 1
    Const CARATTERIDISPARI = 1
    Const NUMLETT = "111111001001000"	‘ 1 = lettera, 0 = Numero
    Const TD = "0100050709131517192102041820110306081214161022252423"
    alterna = 1

    For i = 1 To 15
        car = Asc(Mid$(cf, i, 1))
        If car > 47 And car < 58 Then			'cifre da 0 a 9
            car = car - 48
            num = "0"
        ElseIf car > 64 And car < 91 Then		'lettere
            car = car - 65
            num = "1"
        Else
            num = "3"
        End If
	
        'se c'é una discordanza sulla posizione lettera/numero
        If num <> Mid$(NUMLETT, i, 1) Then
            'memorizza la posizione dell'errore ed esci, ritorna una stringa > 1 carattere
            CalcolaCIN = Str(i) + "Errore"
            Exit Function
        End If

        If alterna = CARATTERIDISPARI Then
            cin = cin + Val(Mid$(TD, car * 2 + 1, 2))	‘Legge un numero nella stringa TD
            alterna = 0
        Else
            cin = cin + car
            alterna = 1
        End If
    Next i

    cin = (cin - Int(cin / 26) * 26) + 65
    'Ritorna una stringa di un carattere contenente il CIN
    CalcolaCIN = Chr$(cin)
        
End Function
Programmi di esempio per il controllo del codice fiscale

tmp = codice fiscale completo

    If CalcolaCIN(Left$(tmp, 15)) <> Right$(tmp, 1) Then
        MsgBox ("Errore nel Codice Fiscale")
    Else
        MsgBox ("Codice Fiscale esatto")
    End If 
Programmi di esempio per la codifica della parte contenente la Data

' strdata formato =  GGMMAA oppure GGMMAAAA
'passare strdata nel formato ggmmaa o ggmmaaaa
'sesso se = 0 é maschile, se = 1 é femminile
Function DecodificaData (strdata As String, sesso As Integer) As String
Dim i As Integer
    Dim mesi, risultato As String
        
    'MESI CODIFICATI
    Const mesi = "ABCDEHLMPRST"

    risultato = Right$ (strdata, 2)							‘Legge anno
    risultato = risultato + Mid$ (mesi, Val(Mid$(strdata, 3, 2)), 1)			‘codifica mese in lettera
    risultato = risultato + Right$ ("0" + Trim(Str(Val(Left$(strdata, 2)) + 40 * sesso)), 2)	‘legge giorno + sesso * 40

    DecodificaData = risultato							‘data nel formato AAMGG
End Function
Programmi di esempio per l’eliminazione dei simboli

'stringa  =  stringa da cui eliminare i simboli
Function EliminaSimboli (stringa As String) As String
    Dim i As Integer, risultato As String, car As String * 1
    
    stringa = UCase$(stringa)
    For i = 1 To Len(stringa)
        car = Mid$(stringa, i, 1)
        If car >= "0" And car <= "Z" Then			'considera solo (?) i numeri e le lettere maiuscole
            risultato = risultato + car
        End If
    Next i
    EliminaSimboli = risultato
End Function
Programmi di esempio per la codifica del nome o del cognome

'‘stringa  =  nome o cognome passati alternativamente
'nc = 1     codifica nome, nc = 0     codifica cognome
Function CodificaCognomeNome (stringa As String, nc As Integer) As String
    Dim i As Integer, vocali As String
    Dim conson As String, car As String * 1
    
    stringa = EliminaSimboli (stringa)
    For i = 1 To Len(stringa)
        car = Mid$(stringa, i, 1)
        If InStr("AEIOU", car) <> 0 Then				'separa le consonanti dalle vocali
            vocali = vocali + car
        Else
            conson = conson + car
        End If
    Next i
    CodificaCognomeNome = Left$(conson + vocali + "X", 3)
    If nc = 1 And Len(conson) > 3 Then				'nome
        CodificaCognomeNome = Left$(conson, 1) + Mid$(conson + vocali, 3, 2) + vocali + "X"
    End If
End Function