![]() |
![]() |
| Paypal | FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
|||||||
| Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
![]() |
|
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
|
Verificar CIF/NIF con c++ Builder
Saludos a todos.
PIDO PERDON...... POR NO HABER VERIFICADO BIEN EL PROGRAMA. DESLICÉ UN ERROR QUE CORRIJO SEGUIDAMENTE Estoy desarrollando una aplicación de compras-ventas-stocks-enlace contable con base de datos MSSQL. Uno de los temas es la comprobación del CIF/NIF. He encontrado bastantes cosas muy útiles explicando el algoritmo y el código fuente en Delphi. He hecho un programa de prueba con un formulario, un botón y un control TEdit. Se introduce un CIF/NIF, se pulsa el botón. Si hay error da un mensaje indicando el valor que debiera tener el dígito o letra de control, devuelve un valor false y se limpia el texto. Si todo va bien no hay mensaje, devuelve true y limpia el texto. Tengo alguna otra cosa de consolidación de balances, cálculo de participaciones, cruzadas o no..... Por si es de interés, allá va el código- //------------------------------------------------ En el fichero de cabecera (fichero Unit1.h) he declarado las funciones: Código:
__published: ............... bool __fastcall EsNumero(String Numero); bool __fastcall EsCif(String Cif); bool __fastcall ValidaCif(String Cif); //------------------------------------------------ Código:
#include <vcl.h>
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma link "CurrEdit"
#pragma link "ToolEdit"
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
bool __fastcall TForm1::EsNumero(String Numero)
{
for(int i=1;i<Numero.Length();i++)
{
if(String("0123456789").AnsiPos(Numero.SubString(i,1))==0)
{
ShowMessage("Ha introducido un carácter "+
Numero.SubString(i,1)+ " que no es numérico");
return false;
}
}
return true;
}
//---------------------------------------------------
bool __fastcall TForm1::EsCif(String Cif)
{
//Comprobamos la letra
if(AnsiString("TRWAGMYFPDXBNJZSQVHLCKET").SubString(
StrToInt(Cif.SubString(1,Cif.Length()-1))%23+1,1)== Cif.SubString(9,1))
return true;
else
{
ShowMessage("La última posición a la derecha debe ser "+
AnsiString("TRWAGMYFPDXBNJZSQVHLCKET").SubString(
StrToInt(Cif.SubString(1,Cif.Length()-1))%23+1,1));
return false;
}
}
//--------------------------------------------------
bool __fastcall TForm1::ValidaCif(String Cif)
{
//1) Quitamos espacios, separadorestodos y convertimos a
// mayúsculas.
String C=StringReplace(Cif," ","",TReplaceFlags() << rfReplaceAll);
C=StringReplace(C,"-","",TReplaceFlags() << rfReplaceAll);
C=StringReplace(C,"/","",TReplaceFlags() << rfReplaceAll);
C=StringReplace(C,".","",TReplaceFlags() << rfReplaceAll);
C=C.UpperCase();
//2) Comprobamos que son 9 caracteres
if(C.Length() != 9)
{
ShowMessage("El número de caracteres introducidos no es válido");
return false;
}
//3 Si es extranjero (1ª posición X, tratamos como Cif,
//cambiando la X por 0
if(C.SubString(1,1)=="X")
C="0"+C.SubString(2,8);
if(String("0123456789").AnsiPos(C.SubString(1,1))>0)
{
//Comprobamos que las 8 primeras posiciones son cifras
if(!EsNumero(C.SubString(1,8)))
return false;
else
return EsCif(C);
}
//Vamos con sociedades y entidades públicas
// Comprobar 1ª letra es válida
if(String("ABCDEFGHKLMNPQS").AnsiPos(C.SubString(1,1))==0)
{
ShowMessage("La primera letra "+C.SubString(1,1)+
" no es correcta");
return false;
}
// Tomamos desde la posición 2 a la 8
// verificamos que los caracteres del 2 al 8 sean cifras
if(!EsNumero(C.SubString(2,7))) return false;
// Sumamos las cifras impares y las pares multiplicadas
// por 2 y tomamos la cifra de las unidades de dicha
// suma
int Suma=0;
for(int i=2;i<9;i++)
{
if(i%2==1)
Suma+=StrToInt(C.SubString(i,1));
else
//Suma+=(2*StrToInt(C.SubString(i,1))%9); código erróneo cuando la cifra es 9 (9*2=18; yo dejaba 0 y debe ser 9)
Suma+=C.SubString(i,1)=="9"?9:(2*StrToInt(C.SubString(i,1)))%9;
}
//Tomamos el resto de dividir entre 10
// Restamos a 10
Suma=(10-Suma%10)%10;
// Si no sea entidad pública
//if(C.SubString(1,1) !="P" & C.SubString(1,1) !="S")//Código substituido son públicas las que empiezan por K,P,Q o S
if(String("KPQS").AnsiPos(C.SubString(1,1))==0)
{
if( IntToStr(Suma) != C.SubString(9,1))
{
ShowMessage("La última posición de la derecha debe ser "+IntToStr(Suma));
return false;
}
else return true;
}
//Sí es entidad pública
if(Suma==0)
Suma=10;
if (C.SubString(9,1)!=String("ABCDEFGHIJ").SubString(Suma,1))
{
ShowMessage("La última posición de la derecha debe ser "+
String("ABCDEFGHIJ").SubString(Suma,1));
return false;
}
else return true;
}
//
void __fastcall TForm1::Button1Click(TObject *Sender)
{
//ValidaCif(Edit1->Text); código substituido es mejor limpiar sólo cuando e CIF sea correcto
if(ValidaCif(Edit1->Text))
Edit1->Text="";
}
/* //ver explicación en http://es.geocities.com/softcv/codigo/cif.html Gracias, muy bien!!!!! El CIF (Código de Identificación Fiscal) es un elemento de identificación administrativa para organizaciones y consta de 9 dígitos: _ _ _ _ _ _ _ _ _ |_| |_|_|_|_|_|_|_| |_| ^ ^ ^ ^ | |_ Números _| | | | | Dígito de control, un número ó letra: | {Aó1,Bó2,Có3,Dó4,Eó5,Fó6,Gó7,Hó8,Ió9,Jó0} | Letra de tipo de Organización, una de las siguientes: {A,B,C,D,E,F,G,H,K,L,M,N,P,Q,S} El primer dígito es una letra que indica el tipo de la organización y puede ser una de los siguientes: A - Sociedad Anónima. B - Sociedad de responsabilidad limitada. C - Sociedad colectiva. D - Sociedad comanditaria. E - Comunidad de bienes. F - Sociedad cooperativa. G - Asociación. H - Comunidad de propietarios. K - Formato antiguo. L - Formato antiguo. M - Formato antiguo. N - Formato antiguo. P - Corporación local. Q - Organismo autónomo S - Organo de la administración. Los siete dígitos siguientes son números y el último es el dígito de control que puede ser un número ó una letra. Las operaciones para calcular el dígito de control se realizan sobre los siete dígitos centrales y son las siguientes: Sumar los dígitos de la posiciones pares. Suma = A Para cada uno de los dígitos de la posiciones impares, multiplicarlo por 2 y sumar los dígitos del resultado. Ej.: ( 8 * 2 = 16 --> 1 + 6 = 7 ). Acumular el resultado. Suma = B. Sumar A + B = C Tomar sólo el dígito de las unidades de C y restárselo a 10. Esta resta nos da D. A partir de D ya se obtiene el dígito de control. Si ha de ser numérico es directamente D y si se trata de una letra se corresponde con la relación: A = 1, B = 2, C = 3, D = 4, E = 5, F = 6, G = 7, H = 8, I = 9, J = 0 Ejemplo para el C.I.F. : A58818501 Utilizamos los siete dígitos centrales = 5881850 Sumamos los dígitos pares: A = 8 + 1 + 5 = 14 Posiciones impares: 5 * 2 = 10 -> 1 + 0 = 1 8 * 2 = 16 -> 1 + 6 = 7 8 * 2 = 16 -> 1 + 6 = 7 0 * 2 = 0 -> = 0 Sumamos los resultados: B = 1 + 7 + 7 + 0 = 15 Suma parcial: C = A + B = 14 + 15 = 29 El dígito de las unidades de C es 9. Se lo restamos a 10 y nos da: D = 10 - 9 = 1 Si el dígito de control ha de ser un número es 1 y si ha de ser una letra es la "A" */ Última edición por Cecilioxx fecha: 16-02-2007 a las 18:17:06. Razón: Mejorar presentación. Corregir algo |
|
#2
|
||||
|
||||
|
Cita:
__________________
Un poco de tu generosidad puede salvar la vida a un niño. ASÍ DE SENCILLO |
|
#3
|
||||
|
||||
|
Bienvenido al club Cecilioxx !!!
Solamente dos consejos, cuando insertes código utiliza las etiquetas [code]Aquí tu código[/code] para que quede mejor colocado. El otro otro es, que como tu código esta bastante bien y puede resultar de utilidad a otros, podrías colocarlo en la sección de trucos. |
![]() |
|
|
Temas Similares
|
||||
| Tema | Autor | Foro | Respuestas | Último mensaje |
| Verificar Apertura de Query | anghell77 | SQL | 4 | 15-08-2006 06:02:23 |
| Verificar si una imagen existe | mcarazas | Varios | 36 | 10-08-2006 13:38:05 |
| verificar fichero de texto | arley_molina | Varios | 2 | 12-06-2006 20:52:40 |
| Verificar impresora | Diegoval | Impresión | 1 | 11-05-2005 06:41:23 |
| Como verificar si un txt existe? | danytorres | Varios | 1 | 02-12-2003 15:51:20 |
|