Qui trovi tutte le istruzioni:
http://www.gmax.it/infocod.htm
Il problema č, come supponevi tu, che bisogna avere un database dei comuni.
Io ce l'ho, lo avevo preso da un programma per il calcolo del codice fiscale
che mi era arrivato con una rivista. Se vuoi te lo posso mandare per posta,
oppure puoi fare come me e cercarlo in qualche software per il calcolo del
CF
ciao Pibe
Dove l'hai trovato il db dei comuni?
ciao
Alessandro
Luisa <Lu...@tiscali.it> wrote in message
Xvns8.74580$S52.2...@news2.tin.it...
Bè possiamo scrivercelo partendo dal sorgente php....
ciao
Alessandro
> Scusate, č la prima volta che scrivo su questo NG e vorrei che qualcuno mi
> indicasse dove poter trovare il codice per il calcolo del Cod. Fiscale. Ci
> vuole pure un database dei comuni? E perchč?
Per quanto riguarda il db dei comuni (Paradox):
http://www24.brinkster.com/walkietalkie/comuni.zip
Per quanto riguarda il codice, lo prendo pari pari da un mio
progetto:
unit uVerifCodici;
interface
type TSetCaratteri = set of Char;
function VerificaCodiceFiscale(CodiceFiscale: String): Boolean;
function VerificaPartitaIVA(PartitaIVA: String): Boolean;
function CalcolaCodiceFiscale(Cognome, Nome: String;
Sesso: Char;
Giorno, Mese, Anno: Word;
CodiceComune: String): String;
function FiltraStringa(S: String; SetCar: TSetCaratteri): String;
implementation
uses SysUtils;
const InsiemeConsonanti: TSetCaratteri =
['A'..'Z']-['A','E','I','O','U'];
InsiemeVocali: TSetCaratteri = ['A','E','I','O','U'];
const CodiciMesi: String = 'ABCDEHLMPRST';
CodiciControllo: String = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ';
function ValoreCarPosPari(C: Char): Integer;
begin
Result := -1;
case C of
'0' : Result := 0;
'1' : Result := 1;
'2' : Result := 2;
'3' : Result := 3;
'4' : Result := 4;
'5' : Result := 5;
'6' : Result := 6;
'7' : Result := 7;
'8' : Result := 8;
'9' : Result := 9;
'A' : Result := 0;
'B' : Result := 1;
'C' : Result := 2;
'D' : Result := 3;
'E' : Result := 4;
'F' : Result := 5;
'G' : Result := 6;
'H' : Result := 7;
'I' : Result := 8;
'J' : Result := 9;
'K' : Result := 10;
'L' : Result := 11;
'M' : Result := 12;
'N' : Result := 13;
'O' : Result := 14;
'P' : Result := 15;
'Q' : Result := 16;
'R' : Result := 17;
'S' : Result := 18;
'T' : Result := 19;
'U' : Result := 20;
'V' : Result := 21;
'W' : Result := 22;
'X' : Result := 23;
'Y' : Result := 24;
'Z' : Result := 25;
end;
end;
function ValoreCarPosDispari(C: Char): Integer;
begin
Result := -1;
case C of
'0' : Result := 1;
'1' : Result := 0;
'2' : Result := 5;
'3' : Result := 7;
'4' : Result := 9;
'5' : Result := 13;
'6' : Result := 15;
'7' : Result := 17;
'8' : Result := 19;
'9' : Result := 21;
'A' : Result := 1;
'B' : Result := 0;
'C' : Result := 5;
'D' : Result := 7;
'E' : Result := 9;
'F' : Result := 13;
'G' : Result := 15;
'H' : Result := 17;
'I' : Result := 19;
'J' : Result := 21;
'K' : Result := 2;
'L' : Result := 4;
'M' : Result := 18;
'N' : Result := 20;
'O' : Result := 11;
'P' : Result := 3;
'Q' : Result := 6;
'R' : Result := 8;
'S' : Result := 12;
'T' : Result := 14;
'U' : Result := 16;
'V' : Result := 10;
'W' : Result := 22;
'X' : Result := 25;
'Y' : Result := 24;
'Z' : Result := 23;
end;
end;
function FiltraStringa(S: String; SetCar: TSetCaratteri): String;
var
I: Integer;
T: String;
begin
T := '';
for I := 1 to Length(S) do
begin
if S[I] in SetCar then
T := T + S[I];
end;
Result := T;
end;
function CalcolaCodiceControllo(CodiceFiscale: String): Char;
var
I, CodiceControllo: Integer;
begin
CodiceControllo := 0;
for I := 1 to Length(CodiceFiscale) do
begin
if Odd(I) then
Inc(CodiceControllo, ValoreCarPosDispari(CodiceFiscale[I]))
else
Inc(CodiceControllo, ValoreCarPosPari(CodiceFiscale[I]))
end;
CodiceControllo := CodiceControllo mod 26;
Result := CodiciControllo[CodiceControllo+1];
end;
//
// ------ Interfaccia
//
function CalcolaCodiceFiscale;
var
ConsonantiCognome: String;
ConsonantiNome: String;
VocaliCognome: String;
VocaliNome: String;
CodiceCognome: String;
CodiceNome: String;
CodiceAnno: String;
CodiceMese: String;
CodiceGiorno: String;
begin
if (Sesso = '') or
(Cognome = '') or
(Nome = '') or
(CodiceComune = '') then
begin
Result := '';
Exit;
end;
Sesso := UpCase(Sesso);
Cognome := FiltraStringa(UpperCase(Trim(Cognome)), ['A'..'Z']);
Nome := FiltraStringa(UpperCase(Trim(Nome)), ['A'..'Z']);
ConsonantiCognome := FiltraStringa(Cognome, InsiemeConsonanti);
ConsonantiNome := FiltraStringa(Nome, InsiemeConsonanti);
VocaliCognome := FiltraStringa(Cognome, InsiemeVocali);
VocaliNome := FiltraStringa(Nome, InsiemeVocali);
CodiceCognome := Copy(ConsonantiCognome + VocaliCognome + 'XX', 1, 3);
CodiceNome := ConsonantiNome + VocaliNome + 'XX';
if (Length(ConsonantiNome) > 3) then
Delete(CodiceNome, 2, 1);
CodiceNome := Copy(CodiceNome, 1, 3);
CodiceAnno := Format('%.2d', [Anno mod 100]);
CodiceMese := CodiciMesi[Mese];
if (Sesso = 'F') then Giorno := Giorno + 40;
CodiceGiorno := Format('%.2d', [Giorno]);
Result := CodiceCognome + CodiceNome +
CodiceAnno + CodiceMese + CodiceGiorno +
CodiceComune;
Result := Result + CalcolaCodiceControllo(Result);
end;
function VerificaCodiceFiscale;
begin
CodiceFiscale := UpperCase(CodiceFiscale);
Result := (CalcolaCodiceControllo(
Copy(CodiceFiscale, 1, Length(CodiceFiscale)-1)
) =
CodiceFiscale[Length(CodiceFiscale)]);
end;
function VerificaPartitaIVA;
var
I: Integer;
Somma: Integer;
Cifre: array [1..11] of Integer;
K: Integer;
begin
PartitaIVA := Trim(PartitaIVA);
if Length(PartitaIVA) <> 11 then
begin
Result := false;
Exit;
end;
for I := 1 to Length(PartitaIVA) do
begin
if not (PartitaIVA[I] in ['0'..'9']) then
begin
Result := false;
Exit;
end;
end;
for I := 1 to 11 do
begin
Cifre[I] := Ord(PartitaIVA[I]) - Ord('0');
end;
Somma := Cifre[1] + Cifre[3] + Cifre[5] + Cifre[7] + Cifre[9];
I := 2;
while (I <= 10) do
begin
K := 2 * Cifre[I];
if K > 9 then K := K - 9;
Somma := Somma + K;
Inc(I, 2);
end;
Result := ((10 - Somma mod 10) mod 10) = Cifre[11];
end;
end.
--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG
"Luisa" <Lu...@tiscali.it> ha scritto nel messaggio:
> Scusate, č la prima volta che scrivo su questo NG e vorrei che qualcuno mi
> indicasse dove poter trovare il codice per il calcolo del Cod. Fiscale.
il codice per il calcolo del codice fiscale dovrebbe essere disponibile sul
news server di Marco Cantů. Fai l'iscrizione ai loro ng (č gratutita)
utilizzando il sito www.marcocantu.it e vai nella sezione repository,
dopodichč scarica il sorgente Delphi per il calcolo del codice fiscale.
Dovrebbe essere stato scritto da Antonio Tarolla ... č un programmatore di
cui ci si puň fidare, quindi scarica tranquillamente! :-)
Ciao
--
- Carlo -
c.b...@libero.it
"Andrea Laforgia" <walkie...@libero.it> wrote in message
news:8781c9a53fdc18ac910...@mygate.mailgate.org...
> Per quanto riguarda il db dei comuni (Paradox):
> http://www24.brinkster.com/walkietalkie/comuni.zip
>
> Per quanto riguarda il codice, lo prendo pari pari da un mio
> progetto:
>
> function ValoreCarPosPari(C: Char): Integer;
> begin
> Result := -1;
questo case secondo me genera troppo codice macchina, potresti fare un
case C of
'0'..'9': Result := Integer(C) - Integer('0');
'A'..'Z': Result := Integer(C) - Integer('A') + 10;
else
Result := -1;
end;
> case C of
> '0' : Result := 0;
> '1' : Result := 1;
> '2' : Result := 2;
> '3' : Result := 3;
> '4' : Result := 4;
...
> end;
> end;
>
>
> function ValoreCarPosDispari(C: Char): Integer;
> begin
> Result := -1;
anche qui come sopra... c'e' un metodo furbo: fare
2 array tipo:
const numeri:array['0'..'9'] of Integer = [1, 0, 5, etc];
caratteri:array['A'..'Z'] of Integer = [...];
e fare
case C of
'0'..'9': Result:=numeri[C];
'A'..'Z': Result:=caratteri[C];
> case C of
> '0' : Result := 1;
> '1' : Result := 0;
> '2' : Result := 5;
> '3' : Result := 7;
....
> > function ValoreCarPosPari(C: Char): Integer;
> > begin
> > Result := -1;
>
> questo case secondo me genera troppo codice macchina, potresti fare un
>
> case C of
> '0'..'9': Result := Integer(C) - Integer('0');
> 'A'..'Z': Result := Integer(C) - Integer('A') + 10;
Dal punto di vista prestazionale, se proprio vogliamo discutere
di queste idiozie, c'e' un costo maggiore nel tuo metodo che
non nel mio: vogliamo vedere quanto occupa una sottrazione
rispetto alla restituzione di un valore secco ?
Un case e' un case, se credi che venga prodotto piu' codice
macchina, perche' usi '0', '1, '2', '3,'..'9', anziche'
'0'..'9' ti sbagli.
Se parli di stile, poi, siamo d'accordo, ma io tendo ad ottimizzare
il codice, anche dal punto di vista stilistico, quando ne vale
realmente la pena e non e' questo il caso. Il codice e' stato
scritto per un progetto reale in tempi brevissimi.
>questo case secondo me genera troppo codice macchina, potresti fare un
>
> case C of
> '0'..'9': Result := Integer(C) - Integer('0');
> 'A'..'Z': Result := Integer(C) - Integer('A') + 10;
> else
> Result := -1;
> end;
Però è più lento e meno leggibile.
>anche qui come sopra... c'e' un metodo furbo: fare
>2 array tipo:
>
>const numeri:array['0'..'9'] of Integer = [1, 0, 5, etc];
> caratteri:array['A'..'Z'] of Integer = [...];
>
> e fare
> case C of
> '0'..'9': Result:=numeri[C];
> 'A'..'Z': Result:=caratteri[C];
>
Anche questo è più lento, occupi più memoria, è meno leggibile, è più
faticoso fare un eventuale debug e il codice macchina generato è
pressapoco uguale.
> Dal punto di vista prestazionale, se proprio vogliamo discutere
> di queste idiozie, c'e' un costo maggiore nel tuo metodo che
caro Andrea, non sono idiozie dal punto di vista del programmatore.
siamo in un gruppo di programmazione e tutto quello che riguarda la
programmazione (ottimizzazione, stile di codice, prestazioni). Se per te
sono idiozie questi allora puoi benissimo postare su it.test o altri.
Ci sono ottimizzazioni e ottimizzazioni, di righe di codice, di tempo
esecuzione, di dimensione del codice generato dal compilatore.
Come sai gia' e' un campo abbastanza vasto...
> vogliamo vedere quanto occupa una sottrazione
> rispetto alla restituzione di un valore secco ?
Pochissimo. 2 o 4 cicli di clock. Che in un calcolo del CF e'
ampiamente trascurabile.
> Un case e' un case, se credi che venga prodotto piu' codice
> macchina, perche' usi '0', '1, '2', '3,'..'9', anziche'
> '0'..'9' ti sbagli.
Non lo so, lo provero' osservando il codice macchina generato,
quando lo compilero' a casa (sono all'universita' e non c'e'
delphi qui)
> Se parli di stile, poi, siamo d'accordo, ma io tendo ad ottimizzare
> il codice, anche dal punto di vista stilistico, quando ne vale
> realmente la pena e non e' questo il caso.
Infatti! Impiegavi meno tempo a scrivere set of che tutta la sfilza
dei case... cq anche a me piace ottimizzare e conoscere nuove tecniche
relative.
> >questo case secondo me genera troppo codice macchina, potresti fare un
> Però è più lento e meno leggibile.
>
> >anche qui come sopra... c'e' un metodo furbo: fare
> >2 array tipo:
> Anche questo è più lento, occupi più memoria, è meno leggibile, è più
> faticoso fare un eventuale debug e il codice macchina generato è
> pressapoco uguale.
ci sono ottimizzazioni e ottimizzazioni... velocita', dimensione,
linee di eseguibile...
>"Unforgiven" <unfor...@somehost.somedomain> wrote in message
>news:tfm6buok72t7scnak...@4ax.com...
>
>> >questo case secondo me genera troppo codice macchina, potresti fare un
>> Però è più lento e meno leggibile.
>>
>> >anche qui come sopra... c'e' un metodo furbo: fare
>> >2 array tipo:
>> Anche questo è più lento, occupi più memoria, è meno leggibile, è più
>> faticoso fare un eventuale debug e il codice macchina generato è
>> pressapoco uguale.
>
>
>ci sono ottimizzazioni e ottimizzazioni... velocita', dimensione,
>linee di eseguibile...
Appunto: con la tua correzione hai peggiorato la velocità, forse hai
migliorato la dimensione el le linee di eseguibile generato, che forse
rallentano di qualche millesimo di secondo il caricamento del
programma in memoria, ma le cose più importanti sono la leggibilità e
la facilità di debug del codice, che hai reso più complessi. Inoltre
la velocità dell'eseguibile non è una cosa trascurabile se hai un file
con i nomi e codici fiscali degli abitanti di un'intera città e ne
devi controllare l'esattezza ;)
> programma in memoria, ma le cose più importanti sono la leggibilità e
> la facilità di debug del codice, che hai reso più complessi.
beh dipende... io programmo dall'86 quindi... ma dai, ogni buon
programmatore sa fare queste cazzate!! poi non mi sembra cosi' troppo
difficile da comprendere queste righe... prova un po' a leggere il
codice del Kernel di linux e confrontalo al mio... ;)
> Inoltre
> la velocità dell'eseguibile non è una cosa trascurabile se hai un file
> con i nomi e codici fiscali degli abitanti di un'intera città e ne
> devi controllare l'esattezza ;)
infatti sono d'accordo con te su questo :)
> caro Andrea, non sono idiozie dal punto di vista del programmatore.
Non farmi lezioni di programmazione per cortesia: le "idiozie" di
cui parlo sono le (false) ottimizzazioni, irrilevanti, di cui
parli. Ribadisco: dal punto di vista stilistico, puo' essere piu'
bello parlare di '0'..'9', che di
'0','1','2','3','4','5','6','7,'8','9',
allora potrei anche essere d'accordo (e se ne stessimo parlando
dondolandoci su un'amaca al sole hawaiano in un agosto rovente).
Non parlarmi, pero', di prestazioni.
> > vogliamo vedere quanto occupa una sottrazione
> > rispetto alla restituzione di un valore secco ?
>
> Pochissimo. 2 o 4 cicli di clock. Che in un calcolo del CF e'
> ampiamente trascurabile.
Sensibilmente piu' lenta, quindi, di una restituzione secca.
In un calcolo del CF e' ampiamente trascurabile, quindi, che
vi sia una sottrazione o una restituzione di un valore secco.
Bene.
Non capisco, a questo punto, la tua puntualizzazione sul codice.
Ti faccio inoltre presente che potresti dover scorrere una
tabella di 100.000 record e calcolare il codice fiscale mancante
per ogni record. Ora fai il calcolo di quanti cicli di clock
ti servono.
> beh dipende... io programmo dall'86 quindi...
Quindi ?
> Non farmi lezioni di programmazione per cortesia: le "idiozie" di
> cui parlo sono le (false) ottimizzazioni, irrilevanti, di cui
> parli.
vuoi una dimostrazione? ora pubblico su un sito i miei risultati e poi
vedi da te. Nemmeno io voglio lezioni di programmazione da te.
> Sensibilmente piu' lenta, quindi, di una restituzione secca.
> In un calcolo del CF e' ampiamente trascurabile, quindi, che
> vi sia una sottrazione o una restituzione di un valore secco.
Giustissimo, d'accordo con te.
> Ti faccio inoltre presente che potresti dover scorrere una
> tabella di 100.000 record e calcolare il codice fiscale mancante
> per ogni record. Ora fai il calcolo di quanti cicli di clock
> ti servono.
Sě questo lo so. Ma la mia dimsotrazione te lo farŕ vedere.
> >questo case secondo me genera troppo codice macchina, potresti fare un
> >
> > case C of
> > '0'..'9': Result := Integer(C) - Integer('0');
> > 'A'..'Z': Result := Integer(C) - Integer('A') + 10;
> > else
> > Result := -1;
> > end;
>
> Però è più lento e meno leggibile.
ho fatto dei test a casa con Delphi 6 enterprise. Il mio codice è
tutt'altro che più lento. Ora pubblico su internet i miei risultati.
>vuoi una dimostrazione? ora pubblico su un sito i miei risultati e poi
>vedi da te.
Si, si, certo.
>Nemmeno io voglio lezioni di programmazione da te.
Io non te ne sto dando, difatti, per lo meno non
gratuitamente.
--
Andrea Laforgia (walkie...@libero.it)
"Usenet is a strange place" [Dennis Ritchie]
>ho fatto dei test a casa con Delphi 6 enterprise. Il mio codice è
>tutt'altro che più lento.
Stiamo aspettando.
> "Open Look" <cele...@excite.it> wrote in message
> news:5a1261fef8d0fbd2eb7...@mygate.mailgate.org...
>
> > beh dipende... io programmo dall'86 quindi...
>
> Quindi ?
Nell'86 o giů di li si ottimizzava tutto, le famose date ddmmyy, i tempi
di cpu, e si,
c'erano i famosi server multiuser, multitasking etc etc.
Ma oggi, 15 Aprile 2002, dove mio nipote di soli 16 anni usa il PC per
giocarci che ha 512 Mb di RAM e 2 o 3 HD mi venite a parlare di
ottimizzazione
per migliorare di qualche decimo di secondo il risultato?
Parliamo di lana caprina.
Bye
Marco
> Parliamo di lana caprina.
> Bye
> Marco
non tutti hanno il picchio da 2Ghz e 512mb ram...e nemmeno la lana
caprina!
"Open Look" <cele...@excite.it> wrote in message
news:bb0b63b3306c89859ca...@mygate.mailgate.org...