Advertisement
NelloRizzo

Codice Fiscale

Sep 27th, 2019
455
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
VB.NET 6.45 KB | None | 0 0
  1. Imports System.Text
  2.  
  3. Module Module1
  4.     ' E' un codice Alfanumerico (composto da lettere e numeri) di 16 caratteri.
  5.     ' I primi 15 sono relativi ai dati personali (nome, cognome, sesso, data di nascita e luogo di nascita)
  6.     ' mentre l'ultimo è un carattere di controllo che viene calcolato con delle formule applicate ai precedenti
  7.     ' 15 caratteri.
  8.     Structure DatiPersonali
  9.         Dim nome As String
  10.         Dim cognome As String
  11.         Dim sesso As String
  12.         Dim datanascita As DateTime
  13.         Dim luogonascita As String
  14.     End Structure
  15.  
  16.     Structure ConsonantiVocali
  17.         Dim consonanti As String
  18.         Dim vocali As String
  19.     End Structure
  20.  
  21.     Function SeparaLettere(testo As String) As ConsonantiVocali
  22.         Dim risultato As ConsonantiVocali
  23.         risultato.vocali = ""
  24.         risultato.consonanti = ""
  25.         ' scorro il testo mettendolo in maiuscolo carattere per carattere
  26.         'For i As Integer = 1 To testo.Length - 1
  27.         '    Dim ch As Char = testo.Chars(i)
  28.         For Each ch As Char In testo.ToUpper
  29.             ' If ch >= "A" And ch <= "Z" Then
  30.             If "ABCDEFGHIJKLMNOPQRSTUVWXYZ".Contains(ch) Then ' si tratta di un carattere alfabetico
  31.                 ' IF ch = "A" Or ch = "E" Or ch = "I" Or ch = "O" Or ch = "U" then
  32.                 If "AEIOU".Contains(ch) Then ' si tratta di una vocale
  33.                     risultato.vocali &= ch
  34.                 Else ' si tratta di una consonante
  35.                     risultato.consonanti &= ch
  36.                 End If
  37.             End If
  38.         Next
  39.         Return risultato
  40.     End Function
  41.  
  42.     Function GestisciCognome(cognome As String) As String
  43.         ' separo le lettere che compongono il nome
  44.         Dim cv As ConsonantiVocali = SeparaLettere(cognome)
  45.         ' Sono necessari 3 caratteri per rappresentare il cognome,
  46.         ' e sono la prima la seconda e la terza consonante del cognome.
  47.         Dim risultato As String = cv.consonanti
  48.         ' E' possibile che le consonanti siano meno di tre,
  49.         ' in questo caso è possibile aggiungere le vocali nell'ordine in cui compaiono nel cognome.
  50.         If risultato.Length < 3 Then
  51.             risultato &= cv.vocali
  52.         End If
  53.         ' Per cognomi più corti di 3 caratteri, è possibile sostituire il carattere mancante con la lettera X.
  54.         If risultato.Length < 3 Then
  55.             risultato &= "X"
  56.         Else
  57.             ' Substring prende una sottostringa: in questo caso 3 caratteri a partire da quello in posizione 0
  58.             risultato = risultato.Substring(0, 3) ' mi devo preoccupare se eventualmente ho aggiunto troppe vocali
  59.         End If
  60.         ' Chiaramente se ci sono cognomi con più parti, è necessario rimuovere
  61.         ' gli spazi e considerare tutto come un cognome unico.
  62.  
  63.         Return risultato
  64.     End Function
  65.  
  66.     Function GestisciNome(nome As String) As String
  67.         ' separo le lettere che compongono il nome
  68.         Dim cv As ConsonantiVocali = SeparaLettere(nome)
  69.         ' Per il nome il discorso è analogo con la particolarità che se il nome è composto
  70.         ' da 4 o più consonanti vengono prese nell'ordine la prima, la terza e la quarta.
  71.         Dim risultato As String = cv.consonanti
  72.         If risultato.Length > 3 Then
  73.             risultato = risultato.Chars(0) & risultato.Substring(2, 2)
  74.             ' risultato = risultato.Remove(1)
  75.         End If
  76.         ' Anche qui potremmo trovarci nella situazione di un numero di consonanti minore di 3
  77.         ' e allo stesso modo si aggiungo le vocali.
  78.         If risultato.Length < 3 Then
  79.             risultato &= cv.vocali
  80.         End If
  81.         ' Ripetiamo anche qui che se il nome è più corto di 3 lettere è possibile sostituire
  82.         ' i caratteri mancanti con delle X.
  83.         If risultato.Length < 3 Then
  84.             risultato &= "X"
  85.         Else
  86.             risultato = risultato.Substring(0, 3) ' mi devo preoccupare se eventualmente ho aggiunto troppe vocali
  87.         End If
  88.         ' Se il nome fosse composto da più nomi, bisogna considerarlo tutto assieme.
  89.         Return risultato
  90.     End Function
  91.     ' un po' di alternative... :D
  92.     Function SeparaLettere2(testo As String) As ConsonantiVocali
  93.         Dim vocali As New StringBuilder
  94.         Dim consonanti As New StringBuilder
  95.         Dim risultato As ConsonantiVocali
  96.         ' scorro il testo mettendolo in maiuscolo carattere per carattere
  97.         For Each ch As Char In testo.ToUpper
  98.             If Char.IsLetter(ch) Then ' si tratta di un carattere alfabetico
  99.                 If "AEIOU".Contains(ch) Then ' si tratta di una vocale
  100.                     vocali.Append(ch)
  101.                 Else ' si tratta di una consonante
  102.                     consonanti.Append(ch)
  103.                 End If
  104.             End If
  105.         Next
  106.         risultato.vocali = vocali.ToString
  107.         risultato.consonanti = consonanti.ToString
  108.         Return risultato
  109.     End Function
  110.     Function GestisciCognome2(cognome As String) As String
  111.         Dim cv As ConsonantiVocali = SeparaLettere(cognome)
  112.         Return String.Format("{0}{1}", cv.consonanti, cv.vocali).PadRight(3, "X").Substring(0, 3)
  113.     End Function
  114.     Function GestisciNome2(nome As String) As String
  115.         Dim cv As ConsonantiVocali = SeparaLettere(nome)
  116.         If cv.consonanti.Length > 3 Then cv.consonanti = cv.consonanti.Remove(1, 1)
  117.         Return String.Format("{0}{1}", cv.consonanti, cv.vocali).PadRight(3, "X").Substring(0, 3)
  118.     End Function
  119.     Function CalcolaCodiceFiscale(dati As DatiPersonali) As String
  120.         Dim risultato As String = ""
  121.         '  è composto dai seguenti blocchi:
  122.         '- 3 lettere per il cognome
  123.         risultato &= GestisciCognome(dati.cognome)
  124.         '- 3 lettere per il nome
  125.         risultato &= GestisciNome(dati.nome)
  126.         '- l'anno di nascita (numero)
  127.         '- il mese della data di nascita (lettera)
  128.         '- il giorno della data di nascita (numero)
  129.         risultato &= "00X00"
  130.         '- il codice del comune di nascita
  131.         risultato &= "X000"
  132.         '- il carattere di controllo
  133.         risultato &= "X"
  134.         Return risultato
  135.     End Function
  136.  
  137.     Sub Main()
  138.         Dim p As DatiPersonali
  139.         p.nome = "Paperon"
  140.         p.cognome = "De' Paperoni"
  141.         p.sesso = "m"
  142.         p.datanascita = "1/1/1900"
  143.         p.luogonascita = "Paperopoli"
  144.         Dim cf As String = CalcolaCodiceFiscale(p)
  145.         Console.WriteLine("Il codice fiscale è: {0}", cf)
  146.     End Sub
  147.  
  148. End Module
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement