Ir al contenido


Foto

Como calcular el CURP (México), RNC (Rep. Dom.), DNI y NIF (España)


  • Por favor identifícate para responder
23 respuestas en este tema

#1 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 13 noviembre 2009 - 08:52

Hola

Ayer platicando con unos amigos vimos la necesidad de calcular el CURP (Clave Única de Registro de Población) y me puse a la tarea de realizar un programita que lo calculara.

Para ello me puse a investigar la forma como se debe de "armar" la cadena y encontré la siguiente información

Imagen Enviada

Enlace

Como pueden observar al final de la cadena hay dos campos.

El campo 17 que corresponde a un digito que evita la duplicidad de registros, este campo es asignado por la Secretaría de Gobernación lo cual nos limita a obtener la clave 100% fiable, sin embargo usaremos el '0' como valor por defecto.

El campo 18 es el dígito verificador el cual es calculado por un algoritmo que encontré navegando en internet.

Pues bien, espero que les sea de utilidad, cualquier comentario y/o bug será bienvenido.

Salud OS


Historial de modificaciones:

******************************************************************************

18-Noviembre-2009

- Valida palabras inconvenientes desde un catálogo, agregando un archivo INI conteniendo estas palabras.

- Valida el año para determinar la homoclave, '0' para antes de 2000 y 'A' para 2000 en adelante.

16-Noviembre-2009

- Asigna el formato de fecha dd/mm/yyyy.

******************************************************************************

Archivos adjuntos


  • 0

#2 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 13 noviembre 2009 - 09:13

:wink:

Para nosotros (dominicanos) que necesitemos verificar la Cédula o el RNC aquí les dejo:


delphi
  1.   type  TDocumentos = (
  2.       dcPendiente = 0,
  3.       dcCedula,
  4.       dcPasaporte,
  5.       dcRNC,
  6.       dcConducir,
  7.       dcArmaFuego
  8.     );
  9.  
  10. function DocumentoValido(Const Tipo:TDocumentos; Documento:string):boolean;
  11. var
  12.     multiplica,longitud:smallInt;
  13.     resto, digito, valor, suma,  i :integer;
  14.     t:string;
  15. const
  16.     peso    :array[0..7] of integer = (7,9,8,6,5,4,3,2);
  17.     remp    :string='-';
  18. begin
  19.  
  20.     t:=documento;
  21.  
  22.     documento:=trim(StringReplace(documento,remp,'',[rfReplaceAll]));
  23.  
  24.     if documento='' then
  25.     begin
  26.       result  :=  false;
  27.       exit;
  28.     end;
  29.     longitud:=length(documento);
  30.  
  31.     //Inicializar la variable suma
  32.     suma:=0;
  33.     case tipo of
  34.     dcCedula, dcConducir, dcArmaFuego: //Es un numero de cedula o su equivalente
  35.         begin
  36.             {La actual cedula electora dominicana usa un digito verificador
  37.             calculado por modulo 10}
  38.             for i:=0 to longitud-2 do
  39.             begin
  40.                 if i mod 2= 0 then
  41.                     multiplica:=1
  42.                 else multiplica:=2;
  43.  
  44.                 valor:=strtoIntDef(documento[i+1],-1)*multiplica;
  45.  
  46.                 //Si el digito que se encontro no es numerico.
  47.                 if valor < 0 then break;
  48.  
  49.                 if valor>9 then
  50.                     valor:=strToIntDef(copy(intTostr(valor),1,1),0)
  51.                         +strToIntDef(copy(intTostr(valor),2,1),0);
  52.  
  53.                 suma:=suma+valor;
  54.             end;
  55.  
  56.             //ahora  la variable Valor toma el digito verificador
  57.             valor:= strToIntDef(copy(documento,longitud,1),0);
  58.  
  59.             //Comprar el resultado
  60.             result:=valor= (10-(suma mod 10)) mod 10;
  61.  
  62.         end;
  63.     dcRNC:  //Asumimos como valor de RNC con 9 caracteres
  64.         begin
  65.             {Calculo del R N C  modulo 11}
  66.             for i:=0 to longitud-2 do
  67.             begin
  68.                 multiplica:=peso[i];
  69.  
  70.                 valor:=strtoIntDef(documento[i+1],-1)*multiplica;
  71.  
  72.                 //Si el digito que se encontro no es numerico.
  73.                 if valor < 0 then break;
  74.  
  75.                 suma:=suma+valor;
  76.             end;
  77.  
  78.             //ahora  la variable Valor toma el digito verificador
  79.             valor:= strToIntDef(copy(documento,longitud,1),0);
  80.  
  81.             resto  :=  trunc(suma - (integer(trunc(suma / 11)) * 11));
  82.  
  83.             case resto of
  84.             0:digito:=2;
  85.             1:digito:=1;
  86.             else digito:=11-resto;
  87.             end;
  88.  
  89.             //result  :=  valor= (11-(suma mod 11)) mod 11;
  90.             result  :=  valor= digito;
  91.         end;
  92.     else
  93.       result:=documento<>'';
  94.  
  95.     end;
  96. end;



Suerte!
  • 0

#3 razadi

razadi

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 681 mensajes
  • LocationMéxico D.F.

Escrito 13 noviembre 2009 - 10:24

Perfecto amigo, gracias por el aporte, casi salio el mio, solo fallo el último dígito, pero casi, casi
por cierto, al parecer nos vamos a ver más seguido...

recibe un saludo
  • 0

#4 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 14 noviembre 2009 - 07:44

Perfecto amigo, gracias por el aporte, casi salio el mio, solo fallo el último dígito, pero casi, casi
por cierto, al parecer nos vamos a ver más seguido...

recibe un saludo


Ah  vaya, parece que se cual es el problema, el campo fecha tiene formato MM/DD/AAAA y no lo he avisado, sorry :$.

Espero vernos pronto :)

Salud OS


  • 0

#5 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 14 noviembre 2009 - 08:00

Muchas gracias por el aporte amigo Rolphy, voy a modificar el titulo del hilo para no cerrarlo a México.

Salud OS
  • 0

#6 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 15 noviembre 2009 - 10:30


Perfecto amigo, gracias por el aporte, casi salio el mio, solo fallo el último dígito, pero casi, casi
por cierto, al parecer nos vamos a ver más seguido...

recibe un saludo


Ah  vaya, parece que se cual es el problema, el campo fecha tiene formato MM/DD/AAAA y no lo he avisado, sorry :$.

Espero vernos pronto :)

Salud OS


Hola, el asunto es por la definición del formato de la fecha en el SO, solo hay que agregar el formato de fecha corta en el programa y los que tenemos el formato "gringo", ya no tendremos ese detalle.



delphi
  1. ShortDateFormat := 'dd/mm/yyyy';



Salud OS

PD, este es un tema de primaria y no lo consideré, lo siento.
  • 0

#7 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 15 noviembre 2009 - 01:40

En mi web tengo el algoritmo para calcular los dígitos de control que aparecen en los pasaportes, y en el caso de España también en el Dni
http://delphi.jmrds.com/?q=node/3
  • 0

#8 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 noviembre 2009 - 02:27

He modificado el título para incluir el algoritmo de España, gracias por el aporte seoane ;)
  • 0

#9 seoane

seoane

    Advanced Member

  • Administrador
  • 1.259 mensajes
  • LocationEspaña

Escrito 15 noviembre 2009 - 03:33

He modificado el título para incluir el algoritmo de España, gracias por el aporte seoane ;)


Pues entonces sera mejor agregar el algoritmo para el calculo del NIF, que es lo que suele interesar mas a la gente:


delphi
  1. function LetraNif(Dni: Integer): Char;
  2. const
  3.   Letras = &#39;TRWAGMYFPDXBNJZSQVHLCKE&#39;;
  4. begin
  5.   Result:= Letras[(Dni mod 23)+1];
  6. end;
  7.  
  8. function ComprobarNif(Nif: String): String;
  9. var
  10.   i: Integer;
  11. begin
  12.   Result:= &#39;NO VALIDO&#39;;
  13.   Nif:= Trim(Uppercase(Nif));
  14.   if Length(Nif) = 9 then
  15.   begin
  16.     if Nif[1] in [&#39;0&#39;..&#39;9&#39;] then
  17.     begin
  18.       if TryStrToInt(Copy(Nif,1,8),i) then
  19.         if LetraNif(i) = Nif[9] then
  20.           Result:= &#39;CORRECTO&#39;;
  21.     end else
  22.     begin
  23.       // Casos especiales
  24.       if TryStrToInt(Copy(Nif,2,7),i) then
  25.         if LetraNif(i) = Nif[9] then
  26.           case Nif[1] of
  27.             &#39;K&#39;: Result:= &#39;CORRECTO&#39;; // Españoles menores de 14 años
  28.             &#39;L&#39;: Result:= &#39;CORRECTO&#39;; // Españoles residentes en el extranjero sin DNI
  29.             &#39;M&#39;: Result:= &#39;CORRECTO&#39;; // NIF que otorga la Agencia Tributaria a extranjeros que no tienen NIE
  30.             &#39;X&#39;: Result:= &#39;CORRECTO&#39;; // Extranjeros identificados por la Policía con un número de identidad de extranjero, NIE, asignado hasta el 15 de julio de 2008
  31.             &#39;Y&#39;: Result:= &#39;CORRECTO&#39;; // Extranjeros identificados por la Policía con un NIE, asignado desde el 16 de julio de 2008 (Orden INT/2058/2008, BOE del 15 de julio )
  32.             &#39;Z&#39;: Result:= &#39;CORRECTO&#39;; // Letra reservada para cuando se agoten los &#39;Y&#39; para Extranjeros identificados por la Policía con un NIE
  33.           end;
  34.     end;
  35.   end;
  36. end;



Por ejemplo:


delphi
  1. // Comprobar un NIF
  2. ShowMessage(ComprobarNif(&#39;12345678Z&#39;))
  3.  
  4. // Comprobar un NIF de un extranjero
  5. ShowMessage(ComprobarNif(&#39;X1234567L&#39;))



Para saber mas la wikipedia  :D
http://es.wikipedia....ficación_fiscal
  • 0

#10 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 noviembre 2009 - 03:54

Vaya :D, excelente amigo :D, modificado de nuevo :p (b)
  • 0

#11 enecumene

enecumene

    Webmaster

  • Administrador
  • 7.419 mensajes
  • LocationRepública Dominicana

Escrito 15 noviembre 2009 - 04:41

Por cierto Rolphy, ¿de casualidad no tendrás algún algoritmo sobre el NCF?.

Saludos.
  • 0

#12 Rolphy Reyes

Rolphy Reyes

    Advanced Member

  • Moderadores
  • PipPipPip
  • 2.092 mensajes
  • LocationRepública Dominicana

Escrito 15 noviembre 2009 - 05:04

Por cierto Rolphy, ¿de casualidad no tendrás algún algoritmo sobre el NCF?.

Saludos.


Saludos.

Enecumene,creo que hasta el momento no hay forma de validar si el NCF es valido o no con un algoritmo.

Recuerda que los primeros números incluyendo el literal están conformados por Tipo NCF, Caja, División y otros datos que no me llegan a la mente ahora mismo, después estaría el número secuencial que la DGI te asigna entonces con ese es que puedes validar que tu número secuencial no sobrepase el dado por la DGI.

Por ahí anda el asunto, pero si requieres de cualquier cosa más sobre el dato, me preguntas.
  • 0

#13 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 15 noviembre 2009 - 08:36

Ah que bien, ya tenemos mas algoritmos. Muchas gracias amigo seoane. (y)

Salud OS
  • 0

#14 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 noviembre 2009 - 06:02

Hola

He actualizado el programa para obtener el CURP, agregando dos modificaciones al mismo.

1. Valida palabras inconvenientes desde un catálogo, agregando un archivo INI conteniendo estas palabras.
2. Valida el año para determinar la homoclave, '0' para antes de 2000 y 'A' para 2000 en adelante.

Salud OS


  • 0

#15 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 17 noviembre 2009 - 08:03

SALUDOS

Te falto un detalle, GENERALMENTE en MEXICO los nombres muy comunes se OMITEN en algunos casos..

Por ejemplo:  Jose Ramon Perez Hernandez 01-01-2000

HEPR-000101-

Si te fijas como JOSE es un NOMBRE Muy COMUN no se agrega en los primera parte del CURP..

lo Mismo sucede con nombres como  JOSE, JUAN, MARIA-...  y no se cuales mas..

Creo que si hay una FORMA de CALCULAR el CURP exacto porque YA EXIETS un PROGRAMA el
cual lo puedes descargar de aqui..  aver si te sirve


http://www.aplicarh....ee/CalcCURP.exe

Encontre un LINK donde esta en VARIOS LENGUAJES.. para el RFC. tal vez te sirva tambien..  ahi si viene lo que te comente de los nombres COMUNES..

http://www.forosdelw...714/index2.html

  • 0

#16 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 noviembre 2009 - 08:12

Muy interesante el asunto de los nombres comunes, investigaré si hay un catálogo de los mismos.

Referente a la exactitud del CURP tengo mis dudas ya que esta información depende de la base de datos que tiene la Secretaría de Gobernación y esa no es pública, hasta donde he investigado, debes estar registrado para poder emitir la cedula del CURP, de otra forma no es posible.

De cualquier forma te agradezco la retroalimentación. (y)

Salud OS
  • 0

#17 pcicom

pcicom

    Advanced Member

  • Miembro Platino
  • PipPipPip
  • 267 mensajes
  • LocationMéxico

Escrito 17 noviembre 2009 - 08:27

Al parecer lo que revise son solo JOSE Y MARIA..

  • 0

#18 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 17 noviembre 2009 - 08:53

Al parecer lo que revise son solo JOSE Y MARIA..


Hola

Veo que son varios criterios de excepción además de los que mencionas.

[Maria] [Ma.] [Ma] [Jose] [J.] [J]

También hay otras excepciones que agregaré en la siguiente version (y)

Salud OS




  • 0

#19 angelo2007

angelo2007

    Advanced Member

  • Miembros
  • PipPipPip
  • 57 mensajes

Escrito 25 abril 2010 - 04:39

los archivos bajan corruptos

¿los pueden resubir.?
  • 0

#20 egostar

egostar

    missing my father, I love my mother.

  • Administrador
  • 14.448 mensajes
  • LocationMéxico

Escrito 25 abril 2010 - 06:31

los archivos bajan corruptos

¿los pueden resubir.?


Ya están arriba de nuevo.

Salud OS

  • 0




IP.Board spam blocked by CleanTalk.