Ne ho trovato uno:
public static string creaCodiceFiscale(string nome,string cognome,DateTime data_nascita, string sesso,string city,string provincia)
{
string temp;
string vocali;
string consonanti;
int i;
int appo_num;
int temp_num;
string txt_cod_fis;
txt_cod_fis = string.Empty;
//RICAVO IL COGNOME (123)
cognome = cognome.ToUpper();
vocali = string.Empty;
consonanti = string.Empty;
string set_vocali = "AEIOU";
string set_consonanti = "BCDFGHJKLMNPQRSTVWXYZ";
for(i=0;i<cognome.Length; i++)
{
if(set_vocali.IndexOf(cognome.Substring(i,1))>-1)
{
vocali = vocali + cognome.Substring(i,1);
}
else if(set_consonanti.IndexOf(cognome.Substring(i,1))>-1)
{
consonanti = consonanti + cognome.Substring(i,1);
}
else
{
// E' uno spazio, un apostrfo o altro che non va considerato
}
if(consonanti.Length == 3) i = cognome.Length;
}
if(consonanti.Length < 3) consonanti = consonanti + vocali.Substring(0 , 3 - consonanti.Length);
if(consonanti.Length < 3) consonanti = consonanti + String(3 - consonanti.Length, "X");
txt_cod_fis = consonanti;
// RICAVO IL NOME (456)
nome = nome.ToUpper();
vocali = string.Empty;
consonanti = string.Empty;
for(i=0;i<nome.Length;i++)
{
if(set_vocali.IndexOf(nome.Substring(i,1))>-1)
{
vocali = vocali + nome.Substring(i,1);
}
else if(set_consonanti.IndexOf(nome.Substring(i,1))>-1)
{
consonanti = consonanti + nome.Substring(i,1);
}
else
{
// E' uno spazio, un apostrfo o altro che non va considerato
}
}
if(consonanti.Length >= 4)
{
// isolo la prima, terza e quarta consonante
consonanti = consonanti.Substring(0, 1) + consonanti.Substring(2, 2);
}
else if(consonanti.Length == 3)
{
// Va bene cosi'
}
else
{
// Aggiungo le vocali
consonanti = (consonanti + vocali).Substring(0, 3);
// se non basta, aggiungo le X
if(consonanti.Length < 3) consonanti = (consonanti + "XXX").Substring(0, 3);
}
txt_cod_fis = txt_cod_fis + consonanti;
//Anno di nascita (78)
txt_cod_fis = txt_cod_fis + data_nascita.ToString("yy");
//Mese di nascita(9)
txt_cod_fis = txt_cod_fis + ("ABCDEHLMPRST").Substring(data_nascita.Month-1, 1);
//Giorno di nascita(0A)
if(sesso.ToUpper() == "F")
{
txt_cod_fis = txt_cod_fis + (data_nascita.Day + 40).ToString();
}
else
{
if(data_nascita.Day.ToString().Length == 1)
{
txt_cod_fis = txt_cod_fis + "0" + data_nascita.Day.ToString();
}
else
{
txt_cod_fis = txt_cod_fis + data_nascita.Day.ToString();
}
}
//Localit di nascita (BCDE)
txt_cod_fis = txt_cod_fis + getCodiceCatastale(city, provincia);
//Ultima lettera (F)
//Controllo caratteri pari
temp_num = 0;
i = 0;
do
{
// I DISPARI
string set_dispari = "B1A0KKPPLLC2QQD3RRE4VVOOSSF5TTG6UUH7MMI8NNJ9WWZZYYXX";
appo_num = set_dispari.IndexOf(txt_cod_fis.Substring(i, 1));
temp_num = temp_num + (appo_num & 0x7FFE) / 2;
i = i + 1;
if (i >= 15) break;
// I PARI
string set_pari = "A0B1C2D3E4F5G6H7I8J9KKLLMMNNOOPPQQRRSSTTUUVVWWXXYYZZ";
appo_num = set_pari.IndexOf(txt_cod_fis.Substring(i, 1));
temp_num = temp_num + (appo_num & 0x7FFE) / 2;
i = i + 1;
}while(i<15);//??
temp_num = temp_num % 26;
txt_cod_fis = txt_cod_fis.Replace(" ","") + ("ABCDEFGHIJKLMNOPQRSTUVWXYZ").Substring(temp_num, 1);
// Ecco qui il codice bello finito
return txt_cod_fis;
}