FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Buscar | Temas de Hoy | Marcar Foros Como Leídos |
|
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 |
Herramientas | Buscar en Tema |
Desplegado | |
|
|
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 |
|