Validar un CIF

3479 vistas

Para validar un CIF podemos usar la siguiente función



delphi
  1. {Cambiar un carácter por otro en una cadena.}
  2. function CadCambioCar(Cadena, CarOrig, CarCambio : String) : String;
  3. var
  4.   i    : Integer;
  5.   Temp : String;
  6. begin
  7.   Temp := '';
  8.   for i := 1 to Length(Cadena) do
  9.     if Copy(Cadena, i, 1) = CarOrig then
  10.       Temp := Temp + CarCambio
  11.     else
  12.       Temp := Temp + Copy(Cadena, i, 1);
  13.   Result := Temp;
  14. end;
  15.  
  16. { Validar si un CIF introducido es correcto}
  17. function EsCif(Cif : String) : Boolean;
  18. var
  19.   Suma, Control : Integer;
  20.   n            : Byte;
  21. begin
  22.   Result := False;
  23.  
  24.   {Se pasa todo a mayúsculas limpio de espacios y de caracteres especiales}
  25.   Cif := UpperCase(Trim(Cif));
  26.  
  27.   {Se limpia de los caracteres '-' y '/'. }
  28.   Cif := CadCambioCar(Cif,'-','');
  29.   Cif := CadCambioCar(Cif,'/','');
  30.  
  31.   {El cif debe ser de 9 cifras}
  32.   if Length(Cif) = 9 then
  33.   begin
  34.     {Comprobamos que sea un NIF}
  35.     if EsNumero(Cif[1]) then
  36.       Result := EsNif(Cif)
  37.     else
  38.       {Se comprueba que la letra que designa el tipo de cif sea correcta}
  39.       if (Pos(Cif[1], 'ABCDEFGHPQSKLMX') = 0) then
  40.         Result := False
  41.       else
  42.         {Se comprueba si es un extranjero,
  43.         en ese caso se calcula el nif, cambiando la X, por 0}
  44.         if Cif[1] = 'X' then
  45.           Result := EsNif('0'+Copy(Cif,2,8))
  46.         else
  47.         begin
  48.           Suma:= StrToInt(Cif[3])+StrToInt(Cif[5])+StrToInt(Cif[7]);
  49.           for n := 1 to 4 do
  50.             Suma := Suma + ((2*StrToInt(Cif[2*n])) mod 10)+((2*StrToInt(Cif[2*n])) div 10);
  51.           Control := 10 - (Suma mod 10);
  52.           {Se comprueba si es de tipo 'P' o 'S', es decir,
  53.           Corporaciones Locales (Ayuntamientos, etc.)
  54.           y Organismos públicos.}
  55.           if Pos(Cif[1],'PS')<>0 then
  56.             {Control tipo letra}
  57.             Result := (Cif[9] = Chr(64+Control))
  58.           else
  59.           {Resto de tipos de CIF}
  60.           begin
  61.             {Control tipo número}
  62.             if Control = 10 then
  63.               Control := 0;
  64.             Result:= ( StrToInt(Cif[9]) = Control);
  65.           end;
  66.         end;
  67.   end;
  68. end;