Il codice fiscale (metodo di calcolo)
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 è:
La seconda riga va letta in questo modo:
Descrizione (Tabella 1):
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.
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.
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.
Vediamo come calcolarlo:
Tabella 2
Essendo il codice fiscale univoco, questi casi devono essere gestiti in modo da risultare univoci per ogni persona.
La gestione del conflitto la fa lo Stato, sostituendo, uno o più dei 7 numeri con una lettera, iniziando dai numeri a destra.
In questo modo si ottengono 128 possibili varianti.
I numeri vengono sostituiti secondo questa tabella:
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 è:
Text
RSS MRA 79 B 11 C566 R
111 111 00 1 00 1000 1
- un 1 indica la presenza di una lettera in quella posizione
- uno 0 indica la presenza di un numero in quella posizione
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
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 (Control Internal Number) 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
L | V | L | V | L | V | L | V | L | V |
---|---|---|---|---|---|---|---|---|---|
A=00 | 01 | B=01 | 00 | C=02 | 05 | D=03 | 07 | E=04 | 09 |
F=05 | 13 | G=06 | 15 | H=07 | 17 | I=08 | 19 | J=09 | 21 |
K=10 | 02 | L=11 | 04 | M=12 | 18 | N=13 | 20 | O=14 | 11 |
P=15 | 03 | Q=16 | 06 | R=17 | 08 | S=18 | 12 | T=19 | 14 |
U=20 | 16 | V=21 | 10 | W=22 | 22 | X=23 | 25 | Y=24 | 24 |
Z=25 | 23 | - | - | - | - | - | - | - | - |
Gestione Omocodia
Per Omocodia si intende la situazione che si verifica quando il codice fiscale, di due o più persone è identico, ovvero il calcolo genera la stessa sequenza di 16 caratteri.Essendo il codice fiscale univoco, questi casi devono essere gestiti in modo da risultare univoci per ogni persona.
La gestione del conflitto la fa lo Stato, sostituendo, uno o più dei 7 numeri con una lettera, iniziando dai numeri a destra.
In questo modo si ottengono 128 possibili varianti.
I numeri vengono sostituiti secondo questa tabella:
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
---|---|---|---|---|---|---|---|---|---|
L | M | N | P | Q | R | S | T | U | V |
Programmi di esempio per il calcolo del CIN
VBScript
'Dove cf è una stringa contenente i primi 15 caratteri del codice fiscale da controllare
'(non gestisce i casi di Omocodia)
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
VBScript
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
VBScript
' 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
VBScript
'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
VBScript
'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