📢 Nuovo Corso Laravel API disponibile!

Progetto Calcolatore di Codice Fiscale in Java

Descrizione del Progetto

In questo progetto, creerai un calcolatore di codice fiscale italiano utilizzando Java. Il programma prenderĂ  in input i dati personali e calcolerĂ  il codice fiscale basato sulle regole ufficiali italiane.

Requisiti

  1. Librerie Java: Utilizzare le librerie standard di Java.
  2. Interfaccia Utente: Creare un’interfaccia grafica utilizzando Swing.
  3. Calcolo del Codice Fiscale:
    • Codificare il cognome e il nome.
    • Codificare la data di nascita e il sesso.
    • Codificare il comune di nascita.
    • Calcolare il carattere di controllo.
  4. Gestione degli Errori: Gestire input non validi.

Struttura del Progetto

codicefiscale/
├── src/
│ ├── Main.java
│ ├── CodiceFiscaleCalculator.java
│ └── Comune.java
└── README.md

Codice di Esempio

Main.java: Questo file contiene il punto di ingresso dell’applicazione.

public class Main {
public static void main(String[] args) {
CodiceFiscaleCalculator calcolatore = new CodiceFiscaleCalculator();
calcolatore.setVisible(true);
}
}

CodiceFiscaleCalculator.java: Questo file contiene l’implementazione dell’interfaccia grafica e del calcolo del codice fiscale.

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Map;
public class CodiceFiscaleCalculator extends JFrame {
private JTextField nomeField;
private JTextField cognomeField;
private JTextField giornoField;
private JTextField annoField;
private JComboBox<String> meseBox;
private JComboBox<String> sessoBox;
private JTextField comuneField;
private JTextField codiceFiscaleField;
private static final Map<String, String> comuniCodici = new HashMap<>();
static {
comuniCodici.put("ROMA", "H501");
comuniCodici.put("MILANO", "F205");
// Aggiungi altri comuni e codici qui
}
public CodiceFiscaleCalculator() {
setTitle("Calcolatore di Codice Fiscale");
setSize(400, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setLocationRelativeTo(null);
setLayout(new GridLayout(8, 2));
JLabel nomeLabel = new JLabel("Nome:");
nomeField = new JTextField();
JLabel cognomeLabel = new JLabel("Cognome:");
cognomeField = new JTextField();
JLabel giornoLabel = new JLabel("Giorno di nascita:");
giornoField = new JTextField();
JLabel meseLabel = new JLabel("Mese di nascita:");
meseBox = new JComboBox<>(new String[]{"Gennaio", "Febbraio", "Marzo", "Aprile", "Maggio", "Giugno", "Luglio", "Agosto", "Settembre", "Ottobre", "Novembre", "Dicembre"});
JLabel annoLabel = new JLabel("Anno di nascita:");
annoField = new JTextField();
JLabel sessoLabel = new JLabel("Sesso:");
sessoBox = new JComboBox<>(new String[]{"M", "F"});
JLabel comuneLabel = new JLabel("Comune di nascita:");
comuneField = new JTextField();
JButton calcolaButton = new JButton("Calcola Codice Fiscale");
codiceFiscaleField = new JTextField();
codiceFiscaleField.setEditable(false);
calcolaButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
String nome = nomeField.getText().toUpperCase();
String cognome = cognomeField.getText().toUpperCase();
int giorno = Integer.parseInt(giornoField.getText());
String mese = (String) meseBox.getSelectedItem();
int anno = Integer.parseInt(annoField.getText());
String sesso = (String) sessoBox.getSelectedItem();
String comune = comuneField.getText().toUpperCase();
String codiceFiscale = calcolaCodiceFiscale(nome, cognome, giorno, mese, anno, sesso, comune);
codiceFiscaleField.setText(codiceFiscale);
}
});
add(nomeLabel);
add(nomeField);
add(cognomeLabel);
add(cognomeField);
add(giornoLabel);
add(giornoField);
add(meseLabel);
add(meseBox);
add(annoLabel);
add(annoField);
add(sessoLabel);
add(sessoBox);
add(comuneLabel);
add(comuneField);
add(calcolaButton);
add(codiceFiscaleField);
}
private String calcolaCodiceFiscale(String nome, String cognome, int giorno, String mese, int anno, String sesso, String comune) {
String codiceCognome = codificaCognome(cognome);
String codiceNome = codificaNome(nome);
String codiceData = codificaData(giorno, mese, anno, sesso);
String codiceComune = comuniCodici.getOrDefault(comune, "XXXX");
String codiceParziale = codiceCognome + codiceNome + codiceData + codiceComune;
String carattereControllo = calcolaCarattereControllo(codiceParziale);
return codiceParziale + carattereControllo;
}
private String codificaCognome(String cognome) {
String consonanti = cognome.replaceAll("[AEIOU]", "");
String vocali = cognome.replaceAll("[^AEIOU]", "");
return (consonanti + vocali + "XXX").substring(0, 3).toUpperCase();
}
private String codificaNome(String nome) {
String consonanti = nome.replaceAll("[AEIOU]", "");
String vocali = nome.replaceAll("[^AEIOU]", "");
if (consonanti.length() > 3) {
consonanti = consonanti.charAt(0) + consonanti.substring(2, 4);
}
return (consonanti + vocali + "XXX").substring(0, 3).toUpperCase();
}
private String codificaData(int giorno, String mese, int anno, String sesso) {
String annoStr = String.valueOf(anno).substring(2);
String meseStr = meseCodice(mese);
if (sesso.equals("F")) {
giorno += 40;
}
String giornoStr = (giorno < 10) ? "0" + giorno : String.valueOf(giorno);
return annoStr + meseStr + giornoStr;
}
private String meseCodice(String mese) {
switch (mese) {
case "Gennaio": return "A";
case "Febbraio": return "B";
case "Marzo": return "C";
case "Aprile": return "D";
case "Maggio": return "E";
case "Giugno": return "H";
case "Luglio": return "L";
case "Agosto": return "M";
case "Settembre": return "P";
case "Ottobre": return "R";
case "Novembre": return "S";
case "Dicembre": return "T";
default: return "X";
}
}
private String calcolaCarattereControllo(String codice) {
int somma = 0;
for (int i = 0; i < codice.length(); i++) {
char c = codice.charAt(i);
int valore = (i % 2 == 0) ? valoreDispari(c) : valorePari(c);
somma += valore;
}
return String.valueOf((char) ('A' + (somma % 26)));
}
private int valoreDispari(char c) {
switch (c) {
case '0': return 1;
case '1': return 0;
case '2': return 5;
case '3': return 7;
case '4': return 9;
case '5': return 13;
case '6': return 15;
case '7': return 17;
case '8': return 19;
case '9': return 21;
case 'A': return 1;
case 'B': return 0;
case 'C': return 5;
case 'D': return 7;
case 'E': return 9;
case 'F': return 13;
case 'G': return 15;
case 'H': return 17;
case 'I': return 19;
case 'J': return 21;
case 'K': return 1;
case 'L': return 0;
case 'M': return 5;
case 'N': return 7
;
case 'O': return 9;
case 'P': return 13;
case 'Q': return 15;
case 'R': return 17;
case 'S': return 19;
case 'T': return 21;
case 'U': return 1;
case 'V': return 0;
case 'W': return 5;
case 'X': return 7;
case 'Y': return 9;
case 'Z': return 13;
default: return 0;
}
}
private int valorePari(char c) {
switch (c) {
case '0': return 0;
case '1': return 1;
case '2': return 2;
case '3': return 3;
case '4': return 4;
case '5': return 5;
case '6': return 6;
case '7': return 7;
case '8': return 8;
case '9': return 9;
case 'A': return 0;
case 'B': return 1;
case 'C': return 2;
case 'D': return 3;
case 'E': return 4;
case 'F': return 5;
case 'G': return 6;
case 'H': return 7;
case 'I': return 8;
case 'J': return 9;
case 'K': return 0;
case 'L': return 1;
case 'M': return 2;
case 'N': return 3;
case 'O': return 4;
case 'P': return 5;
case 'Q': return 6;
case 'R': return 7;
case 'S': return 8;
case 'T': return 9;
case 'U': return 0;
case 'V': return 1;
case 'W': return 2;
case 'X': return 3;
case 'Y': return 4;
case 'Z': return 5;
default: return 0;
}
}
}

Istruzioni per l’Esecuzione

  1. Compilare il Progetto:

    Terminal window
    javac src/Main.java src/CodiceFiscaleCalculator.java -d out
  2. Eseguire l’Applicazione:

    Terminal window
    java -cp out Main

Estensioni Possibili

  1. Interfaccia Grafica Migliorata: Aggiungere ulteriori controlli di input per migliorare l’usabilità.
  2. Database dei Comuni: Integrare un database completo dei comuni italiani per una maggiore accuratezza.
  3. Validazione del Codice Fiscale: Implementare una funzionalità per validare un codice fiscale inserito dall’utente.