Algoritmo Calcolo Codice Fiscale Java

Calcolatore Codice Fiscale Java

Genera il codice fiscale italiano in modo preciso utilizzando l’algoritmo ufficiale implementato in Java. Inserisci i dati anagrafici per ottenere il risultato.

Guida Completa all’Algoritmo di Calcolo del Codice Fiscale in Java

Il codice fiscale italiano è un identificativo alfanumerico univoco assegnato a ogni cittadino per fini fiscali e amministrativi. Questo articolo spiega nel dettaglio come implementare l’algoritmo ufficiale per il calcolo del codice fiscale utilizzando il linguaggio Java, con particolare attenzione alle regole di validazione e ai casi speciali.

Struttura del Codice Fiscale

Il codice fiscale è composto da 16 caratteri con la seguente struttura:

  1. 3 caratteri per il cognome
  2. 3 caratteri per il nome
  3. 2 caratteri per l’anno di nascita
  4. 1 carattere per il mese di nascita
  5. 2 caratteri per il giorno di nascita e il sesso
  6. 4 caratteri per il codice del comune di nascita
  7. 1 carattere di controllo

Passaggi per il Calcolo

1. Elaborazione del Cognome

Per elaborare il cognome:

  • Rimuovere tutti gli spazi
  • Considerare solo le consonanti (in ordine di apparizione)
  • Se le consonanti sono meno di 3, completare con le vocali (in ordine di apparizione)
  • Se il cognome ha meno di 3 caratteri, completare con ‘X’
  • Truncare a 3 caratteri (maiuscoli)
pre { margin: 0; white-space: pre-wrap; } public static String processSurname(String surname) { surname = surname.replaceAll(“\\s+”, “”).toUpperCase(); StringBuilder consonants = new StringBuilder(); StringBuilder vowels = new StringBuilder(); for (char c : surname.toCharArray()) { if (“AEIOU”.indexOf(c) != -1) { vowels.append(c); } else { consonants.append(c); } } String result = consonants.toString(); if (result.length() < 3) { result += vowels.toString(); } return result.length() >= 3 ? result.substring(0, 3) : result + “XXX”.substring(0, 3 – result.length()); }

2. Elaborazione del Nome

La logica è simile al cognome ma con alcune differenze:

  • Se ci sono 4 o più consonanti, si prendono la 1ª, 3ª e 4ª
  • Se ci sono 3 consonanti, si prendono tutte e 3
  • Se ci sono 2 consonanti, si prendono entrambe e si aggiunge la 1ª vocale
  • Se c’è 1 consonante, si prende quella e si aggiungono le prime 2 vocali
  • Se non ci sono consonanti, si prendono le prime 3 vocali
  • Se il nome ha meno di 3 caratteri, completare con ‘X’

3. Data di Nascita

La data di nascita viene codificata come:

  • Anno: ultime 2 cifre (es. 1990 → “90”)
  • Mese: lettera da A (Gennaio) a T (Dicembre) + D (Estero maschile) o R (Estero femminile)
  • Giorno:
    • Per i maschi: giorno del mese (1-31)
    • Per le femmine: giorno del mese + 40
Mese Codice Mese Codice
Gennaio A Luglio L
Febbraio B Agosto M
Marzo C Settembre P
Aprile D Ottobre R
Maggio E Novembre S
Giugno H Dicembre T

4. Codice del Comune

Ogni comune italiano ha un codice catastale di 4 caratteri (es. Roma = H501). Per i comuni esteri si usa il codice ZXXX dove XXX è il codice dello stato estero.

5. Carattere di Controllo

Il carattere di controllo si calcola con un algoritmo specifico:

  1. Si convertono i primi 15 caratteri in valori numerici secondo una tabella prestabilita
  2. Si calcola la somma dei valori in posizione pari e dispari separatamente
  3. Si sommano i due risultati
  4. Si prende il resto della divisione per 26
  5. Si converte il resto in una lettera (A=0, B=1, …, Z=25)
Carattere Valore Posizione Pari Valore Posizione Dispari
0 0 1
1 1 0
2 2 5
3 3 7
4 4 9
5 5 13
6 6 15
7 7 17
8 8 19
9 9 21
A 0 1
B 1 0
C 2 5
D 3 7
E 4 9
F 5 13
G 6 15
H 7 17
I 8 19
J 9 21
K 10 2
L 11 4
M 12 18
N 13 20
O 14 11
P 15 3
Q 16 6
R 17 8
S 18 12
T 19 14
U 20 16
V 21 10
W 22 22
X 23 25
Y 24 24
Z 25 23

Implementazione Completa in Java

Ecco una classe Java completa che implementa l’algoritmo:

public class CodiceFiscaleGenerator { private static final String MONTH_CODES = “ABCDEHLMPRST”; private static final int[] EVEN_POSITIONS = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25}; private static final int[] ODD_POSITIONS = {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}; public static String generateCodiceFiscale(String surname, String name, String gender, String birthDate, String birthPlaceCode) { // Process surname String processedSurname = processSurname(surname); // Process name String processedName = processName(name); // Process birth date String[] dateParts = processBirthDate(birthDate, gender); // Combine all parts String baseCode = processedSurname + processedName + dateParts[0] + // year dateParts[1] + // month dateParts[2] + // day birthPlaceCode; // Calculate control character char controlChar = calculateControlChar(baseCode); return baseCode + controlChar; } private static String processSurname(String surname) { surname = surname.replaceAll(“\\s+”, “”).toUpperCase(); StringBuilder consonants = new StringBuilder(); StringBuilder vowels = new StringBuilder(); for (char c : surname.toCharArray()) { if (“AEIOU”.indexOf(c) != -1) { vowels.append(c); } else { consonants.append(c); } } String result = consonants.toString(); if (result.length() < 3) { result += vowels.toString(); } return result.length() >= 3 ? result.substring(0, 3) : result + “XXX”.substring(0, 3 – result.length()); } private static String processName(String name) { name = name.replaceAll(“\\s+”, “”).toUpperCase(); StringBuilder consonants = new StringBuilder(); StringBuilder vowels = new StringBuilder(); for (char c : name.toCharArray()) { if (“AEIOU”.indexOf(c) != -1) { vowels.append(c); } else { consonants.append(c); } } String result; if (consonants.length() >= 4) { result = “” + consonants.charAt(0) + consonants.charAt(2) + consonants.charAt(3); } else if (consonants.length() == 3) { result = consonants.toString(); } else if (consonants.length() == 2) { result = consonants.toString() + vowels.charAt(0); } else if (consonants.length() == 1) { result = consonants.charAt(0) + vowels.charAt(0) + vowels.charAt(1); } else { result = vowels.substring(0, Math.min(3, vowels.length())); } return result.length() >= 3 ? result.substring(0, 3) : result + “XXX”.substring(0, 3 – result.length()); } private static String[] processBirthDate(String birthDate, String gender) { String[] parts = birthDate.split(“-“); int year = Integer.parseInt(parts[0]); int month = Integer.parseInt(parts[1]); int day = Integer.parseInt(parts[2]); // Year (last 2 digits) String yearCode = String.format(“%02d”, year % 100); // Month char monthCode = MONTH_CODES.charAt(month – 1); // Day (for females add 40) int dayCode = day; if (gender.equalsIgnoreCase(“F”)) { dayCode += 40; } String dayCodeStr = String.format(“%02d”, dayCode); return new String[]{yearCode, String.valueOf(monthCode), dayCodeStr}; } private static char calculateControlChar(String baseCode) { int sum = 0; for (int i = 0; i < baseCode.length(); i++) { char c = baseCode.charAt(i); int value; if (Character.isDigit(c)) { value = Character.getNumericValue(c); } else { value = c - 'A'; } if (i % 2 == 0) { // even position (0-based index) sum += EVEN_POSITIONS[value]; } else { // odd position sum += ODD_POSITIONS[value]; } } int remainder = sum % 26; return (char) ('A' + remainder); } }

Validazione del Codice Fiscale

Per validare un codice fiscale esistente, è possibile:

  1. Verificare che la lunghezza sia esattamente 16 caratteri
  2. Controllare che i primi 6 caratteri siano lettere maiuscole
  3. Verificare che i caratteri 7-11 siano numeri (2 per anno, 1 lettera per mese, 2 per giorno)
  4. Controllare che i caratteri 12-15 siano lettere o numeri (codice comune)
  5. Ricalcolare il carattere di controllo e confrontarlo con il 16° carattere

Casi Particolari

Alcune situazioni richiedono attenzione speciale:

  • Nomi con apostrofo: L’apostrofo viene ignorato (es. “D’ALESSANDRO” → “DLS”)
  • Cognomi composti: Vengono uniti senza spazi (es. “DELLA ROVERE” → “DLR”)
  • Comuni esteri: Si usa il codice Z seguito dal codice dello stato (es. Z100 per Parigi)
  • Date di nascita precedenti al 1900: L’anno viene rappresentato con un offset (es. 1899 → 99)
  • Omonimia: In caso di omonimia, il codice fiscale viene modificato aggiungendo una lettera progressiva

Performance e Ottimizzazione

Per applicazioni che devono generare molti codici fiscali:

  • Pre-caricare i codici dei comuni in una mappa per accesso O(1)
  • Utilizzare StringBuilder invece della concatenazione di stringhe
  • Cacheare i risultati per input ricorrenti
  • Considerare l’uso di thread pool per elaborazioni batch

Librerie Esterne

Esistono diverse librerie Java che implementano già queste funzionalità:

Fonti Ufficiali

Per approfondimenti ufficiali:

Leave a Reply

Your email address will not be published. Required fields are marked *