|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
[C# / solo 2.0]Codice Fiscale
Ciao a tutti
![]() Sto provando ad implementare da me, a scopo didattico, il calcolo del codice fiscale. Sto partendo dall'elemento più semplice da elaborare, ovvero la data di nascita per estrarne il mese e l'anno per poi via via elaborare il resto (per me molto complesso) come cognome, nome e codice di controllo. Sto cercando di vedere le cose da più punti di vista e sono partito da quella che ritenevo l'implementazione più semplice: Codice:
private string EstraiAnnoMese(DateTime dt) { string mese = ""; string anno = dt.ToString("yy"); switch(dt.Month) { case 1: mese = "A"; break; case 2: mese = "B"; break; //et... case 12: mese = "T"; break; default: break; } return mese + anno; } Codice:
Dictionary<string, int> monthDict = new Dictionary<string, int>(); monthDict.Add("A", 1); monthDict.Add("B", 2); //// monthDict.Add("T", 12); //blabla foreach(KeyValuePair<string, int> v in monthDict) { if(v.Value = dt.Month) myMonth = v.Key; } ![]() Grazie mille ![]() RaouL.
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Oct 2007
Città: Padova
Messaggi: 4131
|
Visto che il range dei valori validi per i mesi restituiti da DateTime è dato dall'intervallo 1-12, potresti sostituire il dizionario con un array di caratteri e ottenere il carattere del mese N accedendo all'elemento di indice N-1.
__________________
As long as you are basically literate in programming, you should be able to express any logical relationship you understand. If you don’t understand a logical relationship, you can use the attempt to program it as a means to learn about it. (Chris Crawford) |
![]() |
![]() |
![]() |
#3 | |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Quote:
![]() Dici quindi una cosa tipo: Codice:
char[] monthCode = {'A', 'B', 'et.......'}; char c = monthCode[myDateTime.Value.Month - 1];
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
effettivamente... almeno per anno, mese e giorno sono giunto quindi, al momeno, a:
Codice:
private string GetAnnoMeseGiorno(DateTime dt, bool isLady) { return string.Format("{0:yy"}, dt) + mese[dt.Month - 1] + getGiorno(dt.Day, true); } ![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#5 |
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Se ti interessa un paio di anni fa ho scritto un programma che calcola il codice fiscale in Python, se vuoi ti linko i sorgenti.
|
![]() |
![]() |
![]() |
#6 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
...mmmm... non pensavo di stare così a zero
![]() allora, documentandomi su come operare per il nome e il cognome, leggo che: (lascio solo il cognome che per il nome ci sono altri casotti....) Codice:
L'algoritmo di calcolo 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" E ho già i primi intoppi al solo scrivere su "carta" ![]() Codice:
foreach(char c in testoCognome) { foreach(char consonante in listaConsonanti) { if(c == s) { //non riesco a pensare a come fargli prendere solo le prime tre consonanti... } } }
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#7 |
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
sai usare le regex?
![]() |
![]() |
![]() |
![]() |
#8 |
Senior Member
Iscritto dal: Sep 2004
Messaggi: 3967
|
Ehm.. no ...
![]() Ma ho tanta buona volontà ![]() un piccolo passo però l'ho fatto (almeno per andare avanti) Codice:
int count = 0; if(c == s) { count = cognome.IndexOf(s); //etc.. } ![]()
__________________
Dai wafer di silicio nasce: LoHacker... il primo biscotto Geek ![]() |
![]() |
![]() |
![]() |
#9 |
Senior Member
Iscritto dal: Oct 2006
Città: milano
Messaggi: 1439
|
L'ho fatto anche io qualche anno fa, in un penoso PHP procedurale. Il tuo sarà sicuramente più bello
![]() |
![]() |
![]() |
![]() |
#10 | |
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Quote:
1) non occorre avere l'array delle consonanti e delle vocali, perché essendo complementari basta averne uno (tipo quello delle vocali) e controllare che una lettera sia presente o meno in questo array. 2) man mano che scorri le lettere ti salvi le consonanti, e 3 vocali casomai il cognome non avesse sufficienti consonanti. Ovviamente se ti sei salvato tre consonanti prima di scorrere tutto il cognome puoi fermarti comunque. 3) Una volta scorso il cognome, prendi tutte le consonanti che hai trovato, se non sono 3 accodi le vocali necessarie, e se non sei ancora a 3 caratteri schiaffa le X. Spero di averti aiutato ![]() ![]() |
|
![]() |
![]() |
![]() |
#11 |
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Le regex sono potentissime, quello che devi fare tu in poche righe riesci a scriverlo. Non posso che consigliare a tal proposito il pocket di Marco Beri che è fatto *divinamente*. Tornando a noi, ecco quello che vuoi fare tu, nel modo più semplice possibile e in Python. Ovviamente si può molto migliorare il codice. Quello che hai scritto tu non è molto buono e fai delle iterazioni annidate evitabili. Su carta il concetto è ancora più semplice, in cosa ti blocchi? Il punto è che o in un modo o in un altro per il cognome ti servono tre lettere ok? Basandoti su questo puoi impostare i vari casi. In questo codice ho usato delle funzione esterne per rendere il tutto più pulito.
Queste funzioni non fanno altro che controllare vocali e consonanti per decidere il da farsi. Ecco: Codice:
def calcola_cognome(cognome): cognome = cognome.upper() #Trasforiamo i caratteri del cognome in maiuscoli if "'" in cognome: cognome = cognome.replace("'", "") if " " in cognome: cognome = cognome.replace(" ", "") consonanti = "" if len(cognome) < 3: #Se la lunghezza del cognome e' minore di 3 aggiungiamo una X if vocale(cognome[:1]): cognome = cognome[1:] + cognome[:1] consonanti = cognome + "X" else: for i in cognome: if controllo_vocali(i) and len(consonanti) < 3: consonanti += i if num_consonanti(cognome) < 3: for i in cognome: if vocali_in(i): if len(consonanti) < 3: consonanti += i return consonanti ![]() Ad esempio, io non conosco ancora bene C# visto che ho iniziato a studiarlo da pochissimi giorni, ma non hai delle costanti che rappresentano l'alfabeto? Puoi usare quelle ed eviti di costruirti una lista. Oppure ne approfitti per imparare le regex(e ti garantisco che anni fa conoscerle mi avrebbe risparmiato molto lavoro in parecchi progetti) e gestire il tutto con quelle. Insomma, sbizzarrisciti ![]() Ultima modifica di Ryuzaki_Eru : 20-07-2010 alle 12:08. |
![]() |
![]() |
![]() |
#12 |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Come farebbe con le regex a verificare l'ultima cifra?
E come farebbe con i codici comune? Sono almeno 8000 codici più altri 200 per i paesi esteri. Che fai li elenchi uno a uno nella regex? Ci diventa pazzo. Per non parlare dell'omocodia. |
![]() |
![]() |
![]() |
#13 |
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
si parlava del cognome... forse dovresti leggere più a fondo prima di puntare il dito
|
![]() |
![]() |
![]() |
#14 |
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Nessuno ha nominato i comuni. Oltretutto i codici dei comuni vanno letti da un file o da un database e quindi li trovi già pronti all'uso. Usare una regex in quel caso non ha proprio senso.
Ultima modifica di Ryuzaki_Eru : 18-07-2010 alle 11:58. |
![]() |
![]() |
![]() |
#15 | |
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Oltretutto una verifica blanda del codice fiscale si fa in 50 righe di codice. |
|
![]() |
![]() |
![]() |
#16 | ||
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Quote:
Quote:
|
||
![]() |
![]() |
![]() |
#17 | ||
Senior Member
Iscritto dal: Oct 2005
Messaggi: 3306
|
Quote:
Quote:
![]() Ultima modifica di tomminno : 18-07-2010 alle 14:35. |
||
![]() |
![]() |
![]() |
#18 | ||
Senior Member
Iscritto dal: Jan 2005
Città: Siena
Messaggi: 1313
|
Quote:
Quote:
Ultima modifica di astorcas : 18-07-2010 alle 17:40. |
||
![]() |
![]() |
![]() |
#19 | |||
Senior Member
Iscritto dal: Sep 2009
Città: Nel mondo dei sogni
Messaggi: 4131
|
Quote:
Quote:
Quote:
|
|||
![]() |
![]() |
![]() |
#20 |
Senior Member
Iscritto dal: Feb 2003
Città: Stockholm (SE)
Messaggi: 1343
|
ma com'è che da un po' tutti i topic vanno in caccapupù?
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 12:04.