Advertisement
NelloRizzo

Algoritmo Calcolo Codice Fiscale

Jan 19th, 2018
480
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 6.51 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6.  
  7. namespace CalcoloCodiceFiscale
  8. {
  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.  
  13.     // Una enum definisce un tipo di dato il cui dominio è
  14.     // rappresentato da informazioni numeriche associate
  15.     // a dei valori mnemonici testuali
  16.     public enum GenderType : byte
  17.     {
  18.         Male = 0,
  19.         Female = 40
  20.     }
  21.     public class PersonalData
  22.     {
  23.         // Nome
  24.         public string FirstName { get; set; }
  25.         // Cognome
  26.         public string LastName { get; set; }
  27.         // Sesso
  28.         public GenderType Gender { get; set; }
  29.         // Data di nascita
  30.         public DateTime Birthday { get; set; }
  31.         // Città di nascita
  32.         public string BirthCity { get; set; }
  33.     }
  34.  
  35.     public class CodiceFiscale
  36.     {
  37.         // E' un codice Alfanumerico (composto da lettere e numeri) di 16 caratteri
  38.         public string Calcola(PersonalData data)
  39.         {
  40.             string result = "";
  41.             // E' composto dai seguenti blocchi:
  42.             //-3 lettere per il cognome
  43.             result += handleLastName(data.LastName);
  44.             //-3 lettere per il nome
  45.             result += handleFirstName(data.FirstName);
  46.             //- l'anno di nascita (numero)
  47.             //- il mese della data di nascita(lettera)
  48.             //- il giorno della data di nascita(numero)
  49.             result += handleBirthday(data.Birthday, data.Gender);
  50.             //- il codice del comune di nascita
  51.             result += handleBirthCity(data.BirthCity);
  52.             //- il carattere di controllo
  53.             // l'ultimo è un carattere di controllo che viene calcolato
  54.             // con delle formule applicate ai precedenti 15 caratteri.
  55.             result += calcCheckCode(result);
  56.             return result;
  57.         }
  58.         // Si comincia con il prendere i caratteri del codice fiscale
  59.         // fin qui calcolato che sono 15, si prendono quelli in posizione
  60.         // pari e si convertono con i numeri corrispondenti della prima
  61.         // tabella.Tutti questi numeri vengono sommati.
  62.         // Allo stesso modo con i caratteri dispari che devono
  63.         // essere convertiti però utilizzando la seconda tabella e
  64.         // vengono tutti sommati.
  65.         // I valori ottenuti vengono a loro volta sommati e
  66.         // il totale viene diviso per 26.
  67.         private char calcCheckCode(string fiscalcode)
  68.         {
  69.             int[] odds =
  70.                 { 1, 0, 5, 7, 9, 13, 15, 17, 19, 21, 2, 4, 18, 20,
  71.                  11, 3, 6, 8, 12, 14, 16, 10, 22, 25, 24, 23 };
  72.             int sum = 0;
  73.             for(int index=0; index < 15; ++index)
  74.             {
  75.                 char c = fiscalcode[index];
  76.                 int depl = char.IsDigit(c) ? c - '0' : c - 'A';
  77.                 sum += index % 2 == 0 ? odds[depl] : depl;
  78.             }
  79.             return (char)(sum % 26 + 'A');
  80.         }
  81.  
  82.         private string handleBirthCity(string birthCity)
  83.         {
  84.             return birthCity;
  85.         }
  86.  
  87.         // Anno di nascita
  88.         // Per l'anno vengono prese semplicemente le ultime due cifre.
  89.         // Mese
  90.         // Per quanto riguarda il mese c'è una tabella di conversione
  91.         // che riportiamo qui di seguito.
  92.         // Ad ogni mese corrisponde una lettera dell'alfabeto:
  93.         // Giorno
  94.         // In questo caso è sufficiente riportare il numero del giorno,
  95.         // con il particolare che per le donne questo numero
  96.         // dev'essere aumentato di 40!
  97.         private string handleBirthday(DateTime birthday, GenderType gender)
  98.         {
  99.             const string MONTHS = "ABCDEHLMPRST";
  100.             int day = birthday.Day + (int)gender;
  101.  
  102.             return string.Format("{0:yy}{1}{2:00}",
  103.                 birthday, MONTHS[birthday.Month - 1], day);
  104.         }
  105.         // Per il nome il discorso è analogo con la particolarità
  106.         // che se il nome è composto da 4 o più consonanti vengono
  107.         // prese nell'ordine la prima, la terza e la quarta.
  108.         // Anche qui potremmo trovarci nella situazione di un numero
  109.         // di consonanti minore di 3 e allo stesso modo si aggiungo le vocali.
  110.         // Ripetiamo anche qui che se il nome è più corto di 3 lettere
  111.         // è possibile sostituire i caratteri mancanti con delle X.
  112.         // Se il nome fosse composto da più nomi,
  113.         // bisogna considerarlo tutto assieme.
  114.         private string handleFirstName(string firstName)
  115.         {
  116.             string[] cv = separateVowels(firstName);
  117.             // se il nome è composto da 4 o più consonanti vengono
  118.             if (cv[0].Length > 3)
  119.                 // vengono prese nell'ordine la prima, la terza e la quarta
  120.                 cv[0] = cv[0].Substring(0, 1) + cv[0].Substring(2);
  121.             string result = cv[0] + cv[1] + "XXX";
  122.             return result.Substring(0, 3);
  123.         }
  124.         // Cognome
  125.         // Sono necessari 3 caratteri per rappresentare il cognome,
  126.         // e sono la prima la seconda e la terza consonante del cognome.
  127.         // E' possibile che le consonanti siano meno di tre,
  128.         // in questo caso è possibile aggiungere le vocali nell'ordine
  129.         // in cui compaiono nel cognome.
  130.         // Per cognomi più corti di 3 caratteri,
  131.         // è possibile sostituire il carattere mancante con la lettera X.
  132.         // Chiaramente se ci sono cognomi con più parti,
  133.         // è necessario rimuovere gli spazi e considerare tutto
  134.         // come un cognome unico.
  135.         private string handleLastName(string lastName)
  136.         {
  137.             string[] cv = separateVowels(lastName);
  138.             string result = cv[0] + cv[1] + "XXX";
  139.             return result.Substring(0, 3);
  140.         }
  141.         // metodo che separa le consonanti dalle vocali
  142.         private string[] separateVowels(string text)
  143.         {
  144.             const string VOWELS = "AEIOU";
  145.             string[] result = new string[2];
  146.             for (int index = 0; index < text.Length; ++index)
  147.             {
  148.                 char c = char.ToUpperInvariant(text[index]);
  149.                 if (char.IsLetter(c))
  150.                     if (VOWELS.Contains(c))
  151.                         result[1] += c;
  152.                     else
  153.                         result[0] += c;
  154.             }
  155.             return result;
  156.         }
  157.     }
  158. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement