import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
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<>();
comuniCodici.put("ROMA", "H501");
comuniCodici.put("MILANO", "F205");
// Aggiungi altri comuni e codici qui
public CodiceFiscaleCalculator() {
setTitle("Calcolatore di Codice Fiscale");
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() {
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);
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);
String giornoStr = (giorno < 10) ? "0" + giorno : String.valueOf(giorno);
return annoStr + meseStr + giornoStr;
private String meseCodice(String 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";
private String calcolaCarattereControllo(String codice) {
for (int i = 0; i < codice.length(); i++) {
char c = codice.charAt(i);
int valore = (i % 2 == 0) ? valoreDispari(c) : valorePari(c);
return String.valueOf((char) ('A' + (somma % 26)));
private int valoreDispari(char c) {
private int valorePari(char c) {