Advertisement
NelloRizzo

Calcolo del Codice Fiscale

Nov 29th, 2018
405
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Java 9.33 KB | None | 0 0
  1. package corso.java;
  2.  
  3. import java.util.Calendar;
  4.  
  5. public class Program {
  6.     // Calcolare il codice fiscale di una persona
  7.  
  8.     // Cos'è un Codice Fiscale? Cosa si intende?
  9.     // E' un codice Alfanumerico (composto da lettere e numeri) di 16 caratteri.
  10.     // I primi 15 sono relativi ai [dati personali]
  11.     // ([nome], [cognome], [sesso], [data di nascita] e [luogo di nascita])
  12.     // mentre l'ultimo è un carattere di controllo che viene calcolato con
  13.     // delle formule applicate ai precedenti 15 caratteri.
  14.     static String calcolaCodiceFiscale(String nome, String cognome, char sesso, java.util.Date datanascita,
  15.             String comunenascita) {
  16.         String risultato = ""; // parto da un risultato vuoto
  17.         // - 3 lettere per il cognome
  18.         risultato = risultato + letterePerIlCognome(cognome);
  19.         // - 3 lettere per il nome
  20.         risultato += letterePerIlNome(nome);
  21.         // - l'anno di nascita (numero)
  22.         // - il mese della data di nascita (lettera)
  23.         // - il giorno della data di nascita (numero)
  24.         risultato += letterePerData(datanascita, sesso);
  25.         // - il codice del comune di nascita
  26.         risultato += comunenascita.substring(0, 4).toUpperCase();
  27.         // - il carattere di controllo
  28.         risultato += calcolaCodiceControllo(risultato);
  29.         return risultato;
  30.     }
  31.  
  32.     // Calcolo del codice di controllo
  33.     static char calcolaCodiceControllo(String codfisc) {
  34.         // Si comincia con il prendere i caratteri del codice fiscale fin qui calcolato
  35.         // che sono 15, si prendono quelli in posizione pari e si convertono con i
  36.         // numeri corrispondenti della prima tabella.
  37.         // ***
  38.         // DA UNA ANALISI DELLA TABELLA SI RICAVA CHE:
  39.         // i valori da considerare sono quelli relativi alla posizione
  40.         // della lettera nel proprio insieme (cifra o carattere alfabetico)
  41.         // La tabella infatti è 'A'=0, 'B'=1, 'C'=2... '0'=0, '1'=1, '2'=2...
  42.         // ***
  43.         // Allo stesso modo con i caratteri dispari che devono essere convertiti però
  44.         // utilizzando la seconda tabella e vengono tutti sommati.
  45.         // ***
  46.         // DA UNA ANALISI DELLA TABELLA SI RICAVA CHE:
  47.         // i primi dieci valori sono uguali per le prime 10 lettere e per le cifre
  48.         // quindi posso fare riferimento ad un'unica tabella per entrambe le
  49.         // tipologie di caratteri -> per ottenere il valore
  50.         // da utilizzare dovrò semplicemente calcolare lo spiazzamento del carattere
  51.         // rispetto al proprio insieme di appartenenza, cioè 0-9 o A-Z
  52.         // ***
  53.         int[] dispari = { 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,
  54.                 23 };
  55.         // accumulatore per la somma progressiva
  56.         int somma = 0;
  57.         int sp = 0; // per calcolare lo spiazzamento per individuare il valore da sommare
  58.         // devo ciclare su tutti i caratteri
  59.         // perché i numeri ottenuti dalle tabelle devono essere sommati
  60.         for (int indice = 0; indice < 15; ++indice) {
  61.             char c = codfisc.charAt(indice);
  62.             // calcolo lo spiazzamento rispetto all'insieme di appartenenza del carattere
  63.             if (c >= '0' && c <= '9') // se è una cifra
  64.                 sp = c - '0'; // spiazzamento di una cifra
  65.             else // altrimenti sarà una lettera!
  66.                 sp = c - 'A'; // spiazzamento di una lettera
  67.             if (indice % 2 == 0)
  68.                 // sono in posizione dispari
  69.                 somma += dispari[sp]; // prendo il valore dalla tabella
  70.             else
  71.                 // sono in posizione pari
  72.                 somma += sp; // il valore ottenuto è proprio quello da sommare
  73.         }
  74.         // il totale viene diviso per 26.
  75.         // Il resto della divisione dev'essere convertito usando l'ultima tabella.
  76.         int resto = somma % 26; // resto della divisione tra somma e 26
  77.         // DA UNA ANALISI DELLA TABELLA SI NOTA COME IL CARATTERE FORNITO SIA DATO
  78.         // CONSIDERANDO IL NUMERO OTTENUTO COME SE FOSSE LA POSIZIONE
  79.         // DEL CARATTERE DA RESTITUIRE ALL'INTERNO DELL'ALFABETO
  80.         // Il carattere corrispondente è il codice di controllo!
  81.         return (char) (resto + 'A');
  82.     }
  83.  
  84.     // Gestisce data di nascita e sesso
  85.     static String letterePerData(java.util.Date data, char sesso) {
  86.         String risultato = "";
  87.         // CREIAMO UN CALENDARIO PER LA GESTIONE DELLA DATA
  88.         Calendar cal = Calendar.getInstance();
  89.         cal.setTime(data);
  90.         // RECUPERO LE PARTI DELLA DATA
  91.         int anno = cal.get(Calendar.YEAR); // anno a 4 cifre
  92.         int mese = cal.get(Calendar.MONTH); // Mese da 0 a 11!
  93.         int giorno = cal.get(Calendar.DAY_OF_MONTH); // giorno nel mese
  94.         // Per l'anno vengono prese semplicemente le ultime due cifre.
  95.         risultato += anno;
  96.         risultato = risultato.substring(2);
  97.         // Per quanto riguarda il mese c'è una tabella di conversione.
  98.         // Ad ogni mese corrisponde una lettera dell'alfabeto: ABCDEHLMPRST
  99.         char[] mesi = { 'A', 'B', 'C', 'D', 'E', 'H', 'L', 'M', 'P', 'R', 'S', 'T' };
  100.         risultato += mesi[mese];
  101.         // è sufficiente riportare il numero del giorno,
  102.         if (sesso == 'f' || sesso == 'F')
  103.             // con il particolare che per le donne questo numero dev'essere aumentato di 40!
  104.             giorno += 40;
  105.         // considero il caso in cui giorno sia inferiore a 10
  106.         if (giorno < 10)
  107.             // quindi aggiungo uno 0
  108.             risultato += "0";
  109.         // aggiungo il giorno
  110.         risultato += giorno;
  111.         return risultato;
  112.     }
  113.  
  114.     // Gestisce il nome
  115.     static String letterePerIlNome(String n) {
  116.         String risultato = "";
  117.         // Per il nome il discorso è analogo al cognome,
  118.         String consonanti = dammiConsonanti(n);
  119.         // con la particolarità che se il nome è composto da 4 o più consonanti
  120.         if (consonanti.length() > 3)
  121.             // vengono prese nell'ordine la prima, la terza e la quarta.
  122.             risultato = consonanti.substring(0, 1) + consonanti.substring(2);
  123.         else
  124.             risultato = consonanti;
  125.         // Anche qui potremmo trovarci nella situazione di un numero di
  126.         // consonanti minore di 3 e allo stesso modo si aggiungo le vocali.
  127.         if (risultato.length() < 3)
  128.             risultato += dammiVocali(n);
  129.         // Ripetiamo anche qui che se il nome è più corto di 3 lettere
  130.         // è possibile sostituire i caratteri mancanti con delle X
  131.         if (risultato.length() < 3)
  132.             risultato += "X";
  133.  
  134.         return risultato.substring(0, 3);
  135.     }
  136.  
  137.     // Gestisce il cognome
  138.     static String letterePerIlCognome(String c) {
  139.         String risultato = "";
  140.         // Chiaramente se ci sono cognomi con più parti,
  141.         // è necessario rimuovere gli spazi e considerare tutto come un cognome unico.
  142.         // Sono necessari 3 caratteri per rappresentare il cognome,
  143.         // e sono la prima la seconda e la terza consonante del cognome.
  144.         String consonanti = dammiConsonanti(c);
  145.         risultato = consonanti;
  146.         // E' possibile che le consonanti siano meno di tre,
  147.         if (risultato.length() < 3) {
  148.             // in questo caso è possibile aggiungere le vocali nell'ordine in cui
  149.             // compaiono nel cognome.
  150.             String vocali = dammiVocali(c);
  151.             risultato += vocali;
  152.         }
  153.         // Per cognomi più corti di 3 caratteri,
  154.         if (risultato.length() < 3)
  155.             // è possibile sostituire il
  156.             // carattere mancante con la lettera X.
  157.             risultato += "X";
  158.         // restituisce 3 caratteri (mi mette al riparo dall'aver letto più consonanti)
  159.         return risultato.substring(0, 3);
  160.     }
  161.  
  162.     static String dammiConsonanti(String t) {
  163.         // creo una variabile in cui accumulare il risultato
  164.         String risultato = "";
  165.         // prendo la stringa di input e la memorizzo in maiuscolo
  166.         String testo = t.toUpperCase();
  167.         // Scorro la stringa e prendo solo le consonanti
  168.         // toCharArray() restituisce un array di
  169.         // char da una stringa
  170.         for (char c : testo.toCharArray()) { // enhanced for
  171. //      for (int indice = 0; indice < testo.length(); ++indice) {
  172. //          char c = testo.charAt(indice);
  173.             // controllo che sia un carattere alfabetico (per saltare eventuali
  174.             // spazi o apostrofi) e che non si tratti di una vocale
  175.             if (c >= 'B' && c <= 'Z' && c != 'E' && c != 'I' && c != 'O' && c != 'U')
  176.                 risultato += c;
  177.         }
  178.         return risultato;
  179.     }
  180.  
  181.     static String dammiConsonantiVocali(String t) {
  182.         // creo una variabile in cui accumulare il risultato
  183.         String consonanti = "";
  184.         String vocali = "";
  185.         // prendo la stringa di input e la memorizzo in maiuscolo
  186.         String testo = t.toUpperCase();
  187.         // Scorro la stringa e prendo solo le consonanti
  188.         // toCharArray() restituisce un array di
  189.         // char da una stringa
  190.         for (char c : testo.toCharArray()) { // enhanced for
  191. //      for (int indice = 0; indice < testo.length(); ++indice) {
  192. //          char c = testo.charAt(indice);
  193.             // controllo che sia un carattere alfabetico (per saltare eventuali
  194.             // spazi o apostrofi) e che non si tratti di una vocale
  195.             if (c >= 'A' && c <= 'Z')
  196.                 // se è una vocale
  197.                 if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U')
  198.                     // aggiungo alle vocali
  199.                     vocali += c;
  200.                 else
  201.                     // altrimenti aggiungo alle consonanti
  202.                     consonanti += c;
  203.         }
  204.         // concateno consonanti e vocali e restituisco il valore
  205.         return consonanti + vocali;
  206.     }
  207.  
  208.     static String dammiVocali(String t) {
  209.         // creo una variabile in cui accumulare il risultato
  210.         String risultato = "";
  211.         // prendo la stringa di input e la memorizzo in maiuscolo
  212.         String testo = t.toUpperCase();
  213.         // Scorro la stringa e prendo solo le consonanti
  214.         for (char c : testo.toCharArray())
  215.             // controllo che si tratti di una vocale
  216.             if (c == 'A' || c == 'E' || c == 'I' || c == 'O' || c == 'U')
  217.                 risultato += c;
  218.         return risultato;
  219.     }
  220.  
  221.     public static void main(String[] args) {
  222.         String n = "Paperino";
  223.         String c = "Paolino";
  224.         Calendar d = Calendar.getInstance();
  225.         d.set(1990, Calendar.JANUARY, 1);
  226.         char s = 'm';
  227.         String ci = "P000";
  228.  
  229.         String cf = calcolaCodiceFiscale(n, c, s, d.getTime(), ci);
  230.         System.out.println(cf);
  231.     }
  232.  
  233. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement