 |
Club Builder Foro de C++Builder en español
|
| Ver tema anterior :: Ver tema siguiente |
| Autor |
Mensaje |
SumSum Invitado
|
Publicado: Lun 30 Sep, 2002 3:40 am Asunto: Sobre el CIF ya tengo esto... |
|
|
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 |
|
 |
_Leo Site Admin

Registrado: 11 Ago 2002Mensajes: 1875Ubicación: Lanzarote - Islas Canarias (España)
|
Publicado: Mie 02 Oct, 2002 2:58 am Asunto: |
|
|
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 |
|
 |
SumSum Invitado
|
Publicado: Jue 03 Oct, 2002 2:55 pm Asunto: |
|
|
Mil gracias.
Lo he probado con varios CIF y DNI y funciona a la perfección. |
|
| Volver arriba |
|
 |
bosoft Master

Registrado: 23 Oct 2005Mensajes: 342
|
Publicado: Vie 24 May, 2013 9:33 am Asunto: |
|
|
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 |
|
 |
|
|
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
|
© 2002–2026 Club Builder · Funciona con phpBB.
|