Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Public Enum SexType As Byte
- Male = 0
- Female = 40
- End Enum
- Public Class Person
- ' parte pubblica!!! INTERFACCIA PUBBLICA DELLA CLASSE
- Public Property FirstName As String
- Public Property LastName As String
- Public Property Birthday As DateTime
- Public Property Sex As SexType
- Public Property CityOfBirth As String ' ?????
- ' metodo che implementa il business aziendale
- ' per la fornitura del codice fiscale della persona
- Public Function GetFiscalCode() As String
- ' http://www.dotnethell.it/articles/CalcoloCodiceFiscale.aspx
- 'E' un codice Alfanumerico (composto da lettere e numeri) di 16 caratteri.
- 'I primi 15 sono relativi ai dati personali (nome, cognome, sesso, Data di nascita e luogo di nascita)
- ' mentre l'ultimo è un carattere di controllo che viene calcolato
- ' con delle formule applicate ai precedenti 15 caratteri.
- Dim cf As New Text.StringBuilder(16)
- '- 3 lettere per il cognome
- cf.Append(HandleLastName())
- '- 3 lettere per il nome
- cf.Append(HandleFirstName())
- '- l'anno di nascita (numero)
- '- il mese della data di nascita (lettera)
- '- il giorno della data di nascita (numero)
- cf.Append(HandleBirthDate())
- '- il codice del comune di nascita
- cf.Append(HandleBirthCity())
- '- il carattere di controllo
- cf.Append(CalcCheckCode(cf.ToString()))
- Return cf.ToString
- End Function
- ' calcola il codice di controllo
- 'Si comincia con il prendere i caratteri del codice fiscale fin qui calcolato
- 'che sono 15, si prendono quelli In posizione pari e si convertono con i numeri
- 'corrispondenti della prima tabella. Tutti questi numeri vengono sommati.
- 'Allo stesso modo con i caratteri dispari che devono essere convertiti però
- 'utilizzando la seconda tabella e vengono tutti sommati.
- 'I valori ottenuti vengono a loro volta sommati e il totale viene diviso per 26.
- 'Il resto della divisione dev'essere convertito usando l'ultima tabella.
- 'Il carattere corrispondente è il codice di controllo!
- Private Function CalcCheckCode(code As String) As String
- ' i caratteri sono gestiti in una tabella, cosiddetta ASCII
- ' ad ogni carattere è associato un numero
- Dim table() As Integer =
- {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, 23}
- Dim sum As Integer = 0
- For index As Integer = 0 To 14
- Dim c As Char = code(index) ' prendo il carattere di posizione index
- If index Mod 2 = 0 Then ' indice posizione dispari
- If Char.IsLetter(c) Then
- sum += table(Asc(c) - Asc("A"))
- Else
- sum += table(Asc(c) - Asc("0"))
- End If
- Else ' indice posizione pari
- If Char.IsLetter(c) Then
- sum += Asc(c) - Asc("A")
- Else
- sum += Asc(c) - Asc("0")
- End If
- End If
- Next
- Return Chr(Asc("A") + sum Mod 26)
- End Function
- ' gestisce la città di nascita
- Private Function HandleBirthCity() As String
- Return CityOfBirth.ToUpper
- End Function
- ' gestisce la data di nascita
- 'Anno di nascita
- 'Per l 'anno vengono prese semplicemente le ultime due cifre.
- 'Esempio:
- 'Anno: 1970 - Codice Anno: 70
- 'Mese
- 'Per quanto riguarda il mese c'è una tabella di conversione che riportiamo qui di seguito. Ad ogni mese corrisponde una lettera dell'alfabeto:
- 'ABCDEHLMPRST
- 'Giorno
- 'In questo caso è sufficiente riportare il numero del giorno, con il particolare che per le donne questo numero dev'essere aumentato di 40!
- 'Esempi:
- 'Uomo nato il : 22/10/1980 - Codice Giorno: 22
- 'Donna nata il : 22/10/1980 - Codice Giorno: 62
- Private Function HandleBirthDate() As String
- Dim d = Birthday.Day + Sex 'sex.male = 0, sex.female = 40!!!!
- Dim m = Birthday.Month
- Dim table = "ABCDEHLMPRST"
- Return String.Format("{0:yy}{1}{2:00}", Birthday, table(m - 1), d)
- End Function
- ' gestisce il nome
- 'Per il nome il discorso è analogo con la particolarità che
- 'se il nome è composto da 4 o più consonanti vengono prese
- 'nell'ordine la prima, la terza e la quarta.
- 'Anche qui potremmo trovarci nella situazione di un numero di consonanti minore di 3 e allo stesso modo si aggiungo le vocali.
- 'Ripetiamo anche qui che se il nome è più corto di 3 lettere è possibile sostituire i caratteri mancanti con delle X.
- 'Se il nome fosse composto da più nomi, bisogna considerarlo tutto assieme.
- 'Esempi:
- '(Normale) Nome "MARTA" - Codice Nome: "MRT"
- '(Solo due consonanti) Nome : "SALA" - Codice Nome : "SLA"
- '(Nome minore di 3 car.) Nome: "AL" - Codice Nome : "LAX"
- '(Nome composto) Nome : "MARIA PIA" - Codice Nome : "MRP"
- Private Function HandleFirstName() As String
- Dim cv = SeparateLetters(FirstName)
- If cv.Consonants.Length > 3 Then ' se il nome ha più di 3 consonanti
- ' prendo la prima, salto la seconda e prendo le altre dalla terza in poi
- cv.Consonants = cv.Consonants(0) & cv.Consonants.Substring(2)
- End If
- Return String.Format("{0}{1}XXX", cv.Consonants, cv.Vowels).Substring(0, 3)
- End Function
- ' gestisce il cognome
- ' Sono necessarie come detto prima 3 caratteri per rappresentare il cognome, e sono la prima la seconda e la terza consonante del cognome.
- ' E' possibile che le consonanti siano meno di tre, in questo caso è possibile aggiungere le vocali nell'ordine in cui compaiono nel cognome.
- ' Per cognomi più corti di 3 caratteri, è possibile sostituire il carattere mancante con la lettera X.
- ' Chiaramente se ci sono cognomi con più parti, è necessario rimuovere gli spazi e considerare tutto come un cognome unico.
- '
- ' Esempi:
- ' (Normale) Cognome "ROSSI" - Codice Cognome : "RSS"
- ' (Solo due consonanti) Cognome : "RIVA" - Codice Cognome : "RVI"
- ' (Cognome minore di 3 car.) Cognome : "RE" - Codice Cognome : "REX"
- ' (Cognome composto) Cognome : "DE CRESCENZO" - Codice Cognome : "DCR"
- Private Function HandleLastName() As String
- ' mi servono le consonanti e le vocali del cognome
- ' suppongo di demandare ad un metodo la separazione di consonanti
- ' e vocali
- Dim cv = SeparateLetters(LastName)
- Return String.Format("{0}{1}XXX", cv.Consonants, cv.Vowels).Substring(0, 3)
- End Function
- ' struttura che veicola due informazioni diverse
- ' utilizzata come tipo di risultato della funzione
- Private Structure ConsonantsVowels
- Public Property Consonants As String
- Public Property Vowels As String
- End Structure
- 'separa le consonanti dalle vocali
- Private Function SeparateLetters(text As String) As ConsonantsVowels
- Dim result As New ConsonantsVowels
- For Each c As Char In text.ToUpperInvariant
- If Char.IsLetter(c) Then ' controllo se c è una lettera
- If "AEIOU".Contains(c) Then ' controllo se è una vocale
- result.Vowels &= c ' aggiungo c alle vocali
- Else
- result.Consonants &= c ' aggiungo c alle consonanti
- End If
- End If
- Next
- Return result
- End Function
- ' sovrascrive i metodi di Object
- Public Overrides Function ToString() As String
- Return String.Format("{0} {1} ({2} - {3:d})",
- FirstName,
- LastName,
- Sex.ToString.Substring(0, 1),
- Birthday)
- End Function
- End Class
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement