public bool CheckIsOK() { if (!isChanged) { return(true); } switch (Text.Length) { case 0: return(true); case 11: if (!TaxNoChecker.CheckTaxNo(Text)) { if (MetroMessageBox.Show(FindForm(), Properties.Resources.Msg_TaxNo + Properties.Resources.Msg_Continue, Properties.Resources.Warning, MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) { return(false); } } break; case 16: if (OnlyTaxNo) { return(false); } if (!FiscalCodeChecker.CheckFiscalCode(Text)) { if (MetroMessageBox.Show(FindForm(), Properties.Resources.Msg_FiscalCode + Properties.Resources.Msg_Continue, Properties.Resources.Warning, MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) { return(false); } } break; default: if (MetroMessageBox.Show(FindForm(), Properties.Resources.Msg_LenIncorrect + Properties.Resources.Msg_Continue, Properties.Resources.Warning, MessageBoxButtons.YesNo, MessageBoxIcon.Warning) == DialogResult.No) { return(false); } break; } isChanged = false; return(true); }
public static bool CheckFiscalCode(string CodiceFiscale) { bool result = false; const int caratteri = 16; if (CodiceFiscale == null || CodiceFiscale.Equals(string.Empty)) { return(true); } if (CodiceFiscale.Length < caratteri) { return(TaxNoChecker.CheckTaxNo(CodiceFiscale)); } // se il codice fiscale non è di 16 caratteri il controllo // è già finito prima ancora di cominciare if (CodiceFiscale.Length != caratteri) { return(result); } // stringa per controllo e calcolo omocodia const string omocodici = "LMNPQRSTUV"; // per il calcolo del check digit e la conversione in numero const string listaControllo = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"; int[] listaPari = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25 }; int[] listaDispari = { 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 }; CodiceFiscale = CodiceFiscale.ToUpper(); char[] cCodice = CodiceFiscale.ToCharArray(); // check della correttezza formale del codice fiscale // elimino dalla stringa gli eventuali caratteri utilizzati negli // spazi riservati ai 7 che sono diventati carattere in caso di omocodia for (int k = 6; k < 15; k++) { if ((k == 8) || (k == 11)) { continue; } int x = (omocodici.IndexOf(cCodice[k])); if (x != -1) { cCodice[k] = x.ToString().ToCharArray()[0]; } } // Regex rgx = new Regex(@"^[A-Z]{6}[]{2}[A-Z][]{2}[A-Z][]{3}[A-Z]$"); // Match m = rgx.Match(new string(cCodice)); // result = m.Success; result = true; // da una verifica ho trovato 3 risultati errati su più di 4000 codici fiscali // ho temporaneamente rimosso il test con le Regular fino a quando non riuscirò a capire perchè in alcuni casi sbaglia // normalizzato il codice fiscale se la regular non ha buon // fine è inutile continuare if (result) { int somma = 0; // ripristino il codice fiscale originario // grazie a Lino Barreca che mi ha segnalato l'errore cCodice = CodiceFiscale.ToCharArray(); for (int i = 0; i < 15; i++) { char c = cCodice[i]; int x = "0123456789".IndexOf(c); if (x != -1) { c = listaControllo.Substring(x, 1).ToCharArray()[0]; } x = listaControllo.IndexOf(c); // ho inserito un carattere non valido if (x < 0) { return(false); } // i modulo 2 = 0 è dispari perchè iniziamo da 0 if ((i % 2) == 0) { x = listaDispari[x]; } else { x = listaPari[x]; } somma += x; } result = (listaControllo.Substring(somma % 26, 1) == CodiceFiscale.Substring(15, 1)); } return(result); }