Newsgroup: it.comp.lang.c++
Titolo: [OT]Codice fiscale

Qualcuno conosce una routinetta già fatta, per controllare il codice
fiscale?
Grazie

Il C.F. e' composto da 16 caratteri alfanumerici: i primi 15 caratteri
   indicano i dati anagrafici di ciascuna persona, e il 16ø carattere Š
   un carattere alfabetico di controllo.
   Da sinistra verso destra, questo e' il significato dei caratteri:
  - tra caratteri alfabetici per il cognome;
  - tre caratteri alfabetici per il nome;
  - due caratteri numerici per l' anno di nascita;
  - un carattere alfabetico per il mese di nascita;
  - due numeri per il giorno di nascita e per il sesso;
  - quattro caratteri (uno alfabetico e tre numerici) per il comune
    italiano o per lo stato estero di nascita.
   I tre caratteri indicativi del cognome
  I cognomi che risultano composti da pi— parti vengono considerati
  secondo un' unica successione di caratteri.
  Per le donne sposate si prende in considerazione il cognome da nubile.
  Se il cognome contiene tre o pi— consonanti, i tre caratteri sono la
  prima, la seconda e la terza consonante.
  Se il cognome contiene due consonanti, i tre caratteri sono la prima
  e la seconda consonante e la prima vocale.
  Se il cognome contiene una consonante e due vocali, si considera la
  consonante, la prima e la seconda vocale.
  Se il cognome contiene una consonante e una vocale, si rilevano la
  consonante e la vocale e si assume come terzo carattere la lettera X.
  Se il cognome contiene due sole vocali, esse si rilevano nell' ordine
  e si assume come terzo carattere la lettera X.
   I tre caratteri indicativi del nome
  I nomi doppi o composti vengono considerati come una sola parola.
  Se il nome contiene quattro o pi— consonanti, i tre caratteri da
  considerare sono la prima, la terza e la quarta consonante.
  Se il nome contiene tre consonanti, i tre caratteri da rilevare sono la
  prima, la seconda e la terza consonante.
  Se il nome contiene due consonanti, i tre caratteri risultano
  nell' ordine, la prima e la seconda consonante e la prima vocale.
  Se il nome contiene una consonante e due vocali, i tre caratteri da
  rilevare sono la consonante e quindi la prima e la seconda vocale.
  Se il nome contiene una consonante e una vocale, si considera la
  consonante e la vocale e si assume come terzo carattere la lettera X.
  Se il nome Š costituito da due sole vocali, oltre a queste, si assume
  come terzo carattere la lettera X.
   Data, sesso e luogo di nascita
  I due caratteri indicativi dell' anno di nascita sono le ultime due
  cifre dell' anno stesso.
  Il carattere alfabetico corrispondente al mese di nascita Š quello
  stabilito nella seguente tabella:
    Gennaio  = A       Maggio = E       Settembre = P
    Febbraio = B       Giugno = H       Ottobre   = R
    Marzo    = C       Luglio = L       Novembre  = S
    Aprile   = D       Agosto = M       Dicembre  = T
  I due caratteri numerici relativi al giorno di nascita e al sesso
  vengono determinati nel modo seguente:
    - per i maschi il giorno di nascita figura invariato, con i numeri
   da 1 a 31, facendo precedere dalla cifra 0 i giorni del mese da
   1 a 9;
    - per le femmine il giorno di nascita viene aumentato di quaranta
   unit…, per cui esso figura con i numeri da 41 a 71.
  I quattro caratteri alfanumerici indicativi del luogo di nascita si
  rilevano dal volume ®Codici dei Comuni d' Italia¯ o dal volume
  ®Codici degli Stati Esteri¯, redatti a cura della direzione generale
  del catasto e dei servizi tecnici erariali.
   Il sedicesimo carattere
  Il 16ø carattere controlla la correttezza dei primi quindici.
  A ciascuno dei 15 caratteri di posto pari e di posto dispari viene
  assegnato un numero come indicato nelle tabelle segunti:
  Conversione dei sette caratteri di posto pari
    A o 0 = 0       G o 6 = 6        M = 12       S = 18       Y = 24
    B o 1 = 1       H o 7 = 7        N = 13       T = 19       Z = 25
    C o 2 = 2       I o 8 = 8        O = 14       U = 20
    D o 3 = 3       J o 9 = 9        P = 15       V = 21
    E o 4 = 4       K     = 10       Q = 16       W = 22
    F o 5 = 5       L     = 11       R = 17       X = 23
  Conversione degli otto caratteri di posto dispari
    A o 0 = 1       G o 6 = 15       M = 18       S = 12       Y = 24
    B o 1 = 0       H o 7 = 17       N = 20       T = 14       Z = 23
    C o 2 = 5       I o 8 = 19       O = 11       U = 16
    D o 3 = 7       J o 9 = 21       P = 3        V = 10
    E o 4 = 9       K     = 2        Q = 6        W = 22
    F o 5 = 13      L     = 4        R = 8        X = 25
  I numeri cos  definiti vengono addizionati e la somma si divide per
  il numero 26.
  Il carattere di controllo si ottiene convertendo il resto di tale
  divisione nel carattere corrispondente come indicato nella seguente:
  Conversione del resto nel carattere di controllo
    0 = A      6  = G      12 = M      18 = S      24 = Y
    1 = B      7  = H      13 = N      19 = T      25 = Z
    2 = C      8  = I      14 = O      20 = U
    3 = D      9  = J      15 = P      21 = V
    4 = E      10 = K      16 = Q      22 = W
    5 = F      11 = L      17 = R      23 = X
In una ipotetica classe CodiceFiscale
void CodiceFiscale:: analisiCF_controllo(char *CodFis)
{     // genera il 16° carattere del C.F.
  char Tab[27] = "BAKPLCQDREVOSFTGUHMINJWZYX",     // tabella di conversione
    tb2[2];
  int pari = 0, dispari = 0, count;
  strupr(CodFis);     // converte in maiuscolo il C.F.
  count = 1;          // 2ø elemento dell' array del C.F.
  do {     // calcola il valore dei caratteri di posto pari
     pari += (isalpha(CodFis[count])) ? (CodFis[count] - 'A') :
(CodFis[count] - '0');
     count += 2;           // considera solo i valori di posto pari
  } while (count < 14);
  count = 0;
  tb2[1] = '\0';
  do {     // calcola il valore dei caratteri di posto dispari
         // trasforma un numero in una lettera secondo la tavola ASCII
     tb2[0] = (isdigit(CodFis[count])) ? (CodFis[count] + 17) :
CodFis[count];
     dispari += strcspn(Tab, tb2);      // estrae il valore dalla Tab
 count += 2;           // considera solo i valori di posto dispari
  } while (count < 15);
  pari += dispari;                 // si sommano i due valori
  pari %= 26;                // il carattere di controllo e' il resto
della...
  CodFis[15] = pari + 'A';   // ...divisione per 26 trasformato in lettera
  CodFis[16] = '\0';            // chiude il C.F.   CALCOLO COMPLETATO!!!!!
}
--
Byez.
Stefano Tempesta
s.tem...@usa.net
http://tempesta.freeweb.org
--------------------------------
(-: To "shut down" your system, type "WIN" :-)
(-: Windows VirusScan 1.0 - "Windows found: Remove it? (Y/N)" :-)

}
Grazie Mille!!!

    un carattere alfabetico di controllo.
Attenzione! Il carattere di controllo puo' variare, a discrezione del
Ministero delle Finanze, per evitare la generazione dello stesso codice per
due diversi soggetti fiscali.
Saluti,
Emanuele
-----------== Posted via Deja News, The Discussion Network ==----------
http://www.dejanews.com/
       Search, Read, Discuss, or Start Your Own