Club Builder - Foros de discusión Club Builder
Foro de C++Builder en español
 
 FAQFAQ   BuscarBuscar   MiembrosMiembros   Grupos de UsuariosGrupos de Usuarios   RegistrarseRegistrarse 
 PerfilPerfil   Entra para ver tus mensajes privadosEntra para ver tus mensajes privados   EntrarEntrar 

Sobre el CIF ya tengo esto...

 
Publicar nuevo tema   Responder al tema    Foros de discusión -> Consultas
Ver tema anterior :: Ver tema siguiente  
Autor Mensaje
Mensaje    Asunto: Sobre el CIF ya tengo esto... Responder citando

En Internet encontré el código para Delphi y yo lo he modificado, pero el problema lo tengo para los CIF de Corporaciones locales no sé cómo cambiar esta línea de Delphi a C++:
"Result = (Cif[9] = Chr(64+Control))"

El código lo encontré aquí: http://www.grupoalbor.com/Ideas/IdeasD/Util1.htm

Este es el código que tengo modificado hasta ahora:

AnsiString Cif=Edit1->Text;
int Suma;
int Control;
bool Result=false;

//EJECUTAR SOLO SI LA LONGITUD ES CORRECTA
if (Cif.Length() == 9)
{
//Si es NIF
if (Cif[0]<=9)
//es nif
ShowMessage("Es NIF");
else
{
//es CIF, comprueba que la letra inicial sea correcta
if (Cif[1]!='A' && Cif[1]!='B' && Cif[1]!='C' && Cif[1]!='D' && Cif[1]!='E' && Cif[1]!='F' && Cif[1]!='G' && Cif[1]!='H' && Cif[1]!='P' && Cif[1]!='Q' && Cif[1]!='S' && Cif[1]!='K' && Cif[1]!='L' && Cif[1]!='M')
{
ShowMessage("error: letra inicial incorrecta");
Result=false;
}
else
{
Suma= StrToInt(Cif[3])+StrToInt(Cif[5])+StrToInt(Cif[7]);
for (int n = 1; n < 5; n++)
{
Suma = Suma + ((2*StrToInt(Cif[2*n])) % 10)+((2*StrToInt(Cif[2*n])) / 10);
}
Control = 10 - (Suma % 10);

//si es de tipo 'P' o 'S', es decir, Corporaciones Locales (Ayuntamientos, etc.) y Organismos públicos.
if (Cif[0]=='P' || Cif[0]=='S')
//el Control es tipo letra
//Result = (Cif[9] = chr(64+Control));
ShowMessage("no sé");
else
//{Resto de tipos de CIF}
{
//{Control tipo número}
if (Control == 10)
Control = 0;
if ( StrToInt(Cif[9]) == Control)
Result=true;
}
}
}
}
if (Result==false)
ShowMessage("ERROR");
if (Result==true)
ShowMessage("CORRECTO");

Gracias.
Volver arriba
Mensaje    Asunto: Responder citando

Hola:

Siguiendo el código en Delphi que presentas he hecho esta rutina, la misma sirve para comprobar un CIF o un NIF (tanto normal como los que comienzan con X).

He probado con unos cuantos y parece que va bien, aunque lo he ido pasando sobre la marcha y es posible que contenga algún error, así como posiblemente si lo revisamos con mas tranquilidad se pueda abreviar un poco.

Código:
// Validar si un CIF/NIF introducido es correcto
//   devuelve true si es válido o false en caso contrario
bool EsCifNif(String Num)
{
    Byte n = 0;

    // Se pasa todo a mayúsculas limpio de espacios y de caracteres especiales
    Num = Num.Trim().UpperCase();

    // Se limpia todos los caracteres que no sean letras o números
    for (int i=1; i<=Num.Length(); i++)
        if ( isalnum(Num[i]) )
            Num[++n] = Num[i];
    Num.SetLength(n);

    // El CIF/NIF debe ser de 9 cifras
    if ( Num.Length() != 9 )
        return false;

    // Si el primer caracter es 'X' es un NIF de extranjero
    //   se reemplaza la X por 0 y se calcula igual que un NIF normal
    if ( Num[1] == 'X' )
        Num[1] = '0';

    if ( isdigit(Num[1]) )  // Es un NIF
        return "TRWAGMYFPDXBNJZSQVHLCKE"[Num.SubString(1,8).ToIntDef(0)%23] == Num[9];
    else    // Es un CIF
    {
        // Se comprueba que la letra que designa el tipo de CIF sea correcta
        if ( !AnsiPos(Num[1], "ABCDEFGHPQSKLM") )
            return false;

        int Suma = StrToInt(Num[3]) + StrToInt(Num[5]) + StrToInt(Num[7]);
        for (n=1; n<=4; n++)
            Suma += ((2*StrToInt(Num[2*n])) % 10)+((2*StrToInt(Num[2*n])) / 10);

        int Control = 10 - (Suma % 10);
        // Se comprueba si es de tipo 'P' o 'S', es decir,
        //   Corporaciones Locales (Ayuntamientos, etc.) y Organismos públicos.
        if ( AnsiPos(Num[1],"PS") )    // Control tipo letra
            return (Num[9] == 64+Control);
        else    // Resto de tipos de CIF
        {
            // Control tipo número
            if ( Control == 10 )
                Control = 0;
            return ( StrToInt(Num[9]) == Control );
        }
    }
}


Y un ejemplo de uso:
(Se le puede pasar el CIF/NIF en cualquier formato, ya que la rutina quita todos los separadores)
Código:
    ShowMessage( EsCifNif("A-81028631") ? "Válido":"No válido" );


Espero que te sirva o si alguien lo prueba y encuentra algún error que lo comente.

Saludos:
_Leo
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mensaje    Asunto: Responder citando

Mil gracias.

Lo he probado con varios CIF y DNI y funciona a la perfección.
Volver arriba
Mensaje    Asunto: Responder citando

Hola
Refloto este post, porque después de varios años usando la función de _Leo me ha saltado un error al comprobar un CIF oficial con formato QxxxxxxxH

Así que lo he corregido
Código:
        int Control = 10 - (Suma % 10);
        // Se comprueba si es de tipo 'P' o 'S' o 'Q', es decir,
        //   Corporaciones Locales (Ayuntamientos, etc.) y Organismos públicos.
        if ( AnsiPos(Num[1],"PSQ") )    // Control tipo letra  ///----> añadido 'Q'
            return (Num[9] == 64+Control);
        else    // Resto de tipos de CIF


También en su día añadí un bucle para controlar si al menos habían 7 dígitos numéricos, puesto que yo usaba esa función para validar si el dato era un CIF/NIF o un texto (nombre u observación). Eso ocurre en los archivos de movimientos bancarios tipo N43
Código:

   // El CIF/NIF debe ser de 9 cifras
   if ( Num.Length() != 9 )
      return false;
//--------------------------------------------------------------
   // hay solo letras?
   //deben haber al menos 7 dígitos
       //extranjeros, corporaciones, organismos
   n = 0;
   for(int i=1; i<=Num.Length(); i++)
      if(isdigit(Num[i])) n++;
   if(n<7) return false;
//-----------------------------------------------------------------

    // Si el primer caracter es 'X' es un NIF de extranjero
    //   se reemplaza la X por 0 y se calcula igual que un NIF normal
    if ( Num[1] == 'X' )
        Num[1] = '0';


Saludos
Volver arriba
Ver perfil de usuario Enviar mensaje privado
Mostrar mensajes de anteriores:   
Cambiar a:  
No puedes publicar temas nuevos en este foro
No puedes responder a temas en este foro
No puedes editar tus mensajes en este foro
No puedes borrar tus mensajes en este foro
No puedes votar en las encuestas de este foro


Hosting WordPress Indedmedia desde 3,99 €
© 2002–2026 Club Builder · Funciona con phpBB.