Algoritmo DNI

1,821 views
Skip to first unread message

Samuel San Miguel Hernández

unread,
Jun 13, 2012, 11:04:07 PM6/13/12
to publice...@googlegroups.com
Hola Foro,
Estoy buscando un algoritmo para validar los DNI en PERÚ... (es algo asi como el validador del código verificador de Codigos de barra).
Si alguien lo tiene a la mano me lo puede hacer llegar?

Gracias.

Samuel San Miguel Hernández

unread,
Jun 13, 2012, 11:05:22 PM6/13/12
to publice...@googlegroups.com
Un ejemplo:

10764878   *****ES VALIDO
41562184   *****ES VALIDO
99999999   *****NO ES VALIDO
111111111   *****NO ES VALIDO

Gracias,

Samuel San Miguel Hernández

unread,
Jun 14, 2012, 12:53:21 AM6/14/12
to publice...@googlegroups.com
Ah me olvidaba, las disculpas del caso por no estar comentando más seguido... pero en mi trabajo  nos cortaron la opción de RESPONDER mensajes del FORO, solo puedo Leer y crear nuevos Post, pero no Responder... es que seguro vieron que me envisiaba mucho y dejaba de lado el trabajo... jeje.

Bueno espero la ayuda necesaria,

PD.
este post fue escrito y respondido desde mi CASA.

Miguel

unread,
Jun 14, 2012, 2:47:38 AM6/14/12
to Comunidad de Visual Foxpro en Español
Hola Samuel,

Adjunto el código para validar NIF de personas físicas y sociedades
que se aplica al menos en España. No recuerdo si el cógido inicial es
mío o si me inspiré en algún sitio, lo que si recuerdo es que las
últimas adaptaciones la hice yo.

Saludos,
Miguel

*****************************************************************************
PARAM MICIF
*****************************************************************************
STORE "TRWAGMYFPDXBNJZSQVHLCKE" TO TABLA
STORE .T. TO ERROR2
STORE MICIF TO LENIF
STORE " " TO LETRA
STORE 0 TO DNI
STORE 0 TO NAUX
STORE 0 TO SUMA
STORE MICIF TO MINIF

* Limpiar el nif de caracteres no deseados
LENIF=STRTRAN(LENIF,"-","")
LENIF=STRTRAN(LENIF,"/","")
LENIF=STRTRAN(LENIF,".","")
LENIF=UPPER(ALLTRIM(LENIF))

* Si hay un carácter a la izquierda alfabético
IF ISALPHA(LENIF)
LETRA=UPPER(SUBSTR(LENIF,1,1))
IF LETRA$"ABCDEFGHJPQRUVNWSKLM"
IF LEN(LENIF)=9 THEN
SUMA=VAL(SUBSTR(LENIF,3,1))+VAL(SUBSTR(LENIF,5,1))
+VAL(SUBSTR(LENIF,7,1))
*SUMAMOS CIFRAS EN LUGARES IMPARES Y PARES POR 2N
FOR I=1 TO 4
SUMA = SUMA+ MOD(2*VAL(SUBSTR(LENIF,2*I,1)),10)+
INT(2*VAL(SUBSTR(LENIF,2*I,1))/10)
NEXT I
*SI LAS LETRAS SON P O Q ACABA EN LETRA QUE SE CALCULA ASI
IF LETRA$"PQS" THEN
IF SUBSTR(LENIF,9,1)=CHR(64+(10-MOD(SUMA,10))) THEN
STORE .F. TO error2
ELSE
MINIF="Posible error en letra final "
ENDIF
*SI NO SON LAS LETRAS DE ARRIBA COMPROBAMOS
ELSE
IF MOD(10-MOD(SUMA,10),10)=VAL(SUBSTR(LENIF,9,1)) THEN
STORE .F. TO error2
ELSE
MINIF="Posible error en dígitos "
ENDIF
ENDIF
ELSE
*ERROR EN LA LONGITUD DEL NIF
MINIF="Longitud incorrecta "
ENDIF
ELSE
IF LETRA="X" THEN
LETRA=RIGHT(LENIF,1)
DNI=VAL(SUBSTR(LENIF,2,8))
STORE MOD(DNI,23) TO NAUX
IF LETRA=SUBSTR(TABLA,NAUX+1,1)
STORE .F. TO error2
IF LEN(LENIF)<9
LENIF="X"+replicate("0",9-len(alltrim(LENIF)))
+alltrim(SUBSTR(LENIF,2,8))
STORE .T. TO error2
MINIF="ERROR*"+LENIF
ENDIF
ELSE
STORE MOD(DNI,23) TO NAUX
STORE " " TO LENIF
STORE "X"+RTRIM(LTRIM(STR(INT(DNI))+SUBSTR(TABLA,NAUX
+1,1))) TO LENIF
IF LEN(LENIF)<9
LENIF="X"+replicate("0",9-len(alltrim(LENIF)))
+alltrim(SUBSTR(LENIF,2,8))
ENDIF
MINIF="Si los números son correctos el NIF es "+LENIF
ENDIF
ELSE
*NO COMIENZA POR LETRA VALIDA
MINIF="Letra de inicio incorrecta "
ENDIF
ENDIF
ELSE
LETRA=RIGHT(LENIF,1)
LETRA=UPPER(LETRA)
DNI=VAL(LENIF)
STORE MOD(DNI,23) TO NAUX
IF LETRA=SUBSTR(TABLA,NAUX+1,1)
STORE .F. TO error2
IF LEN(LENIF)<9
LENIF=replicate("0",9-len(alltrim(LENIF)))+alltrim(LENIF)
STORE .T. TO error2
MINIF="Longitud incorrecta "+LENIF
ENDIF
ELSE
STORE MOD(DNI,23) TO NAUX
STORE " " TO LENIF
STORE RTRIM(LTRIM(STR(INT(DNI))+SUBSTR(TABLA,NAUX+1,1))) TO
LENIF
IF LEN(LENIF)<9
LENIF=replicate("0",9-len(alltrim(LENIF)))+alltrim(LENIF)
ENDIF
MINIF="Si los números son correctos el NIF es "+LENIF
ENDIF
ENDIF
RETURN




On 14 jun, 06:53, Samuel San Miguel Hernández
> >> Gracias.- Ocultar texto de la cita -
>
> - Mostrar texto de la cita -

Miguel

unread,
Jun 14, 2012, 2:51:07 AM6/14/12
to Comunidad de Visual Foxpro en Español
Las opciones de responder se activan al registrarte en Google con un
nic y una contraseña y en esas opciones puedes marcar o no que recibas
los mensajes por email, yo personalmente lo tengo desactivado porque
este foro es muy activo y no quiero que me colapse el email.

Saludos,
Miguel


On 14 jun, 06:53, Samuel San Miguel Hernández
<ssanmiguelhernan...@gmail.com> wrote:

Daniel Sánchez

unread,
Jun 14, 2012, 10:06:14 AM6/14/12
to publice...@googlegroups.com
En este caso el número que otorgan es el número libre siguiente no hay ningún algoritmo parecido, en mi caso comienza con 18 otros en Chimbote comienza con 0X y así, los DNI de mis hijos sus números son consecutivos ya que se inscribieron juntos y comienza con 74, por eso te comento que no hay un algoritmo, lo que si podría haber es los dígitos iniciales podrían identificar a la zona o región de donde se emite el DNI, aunque no creo ya que el mio empieza con 18 y el de mis hijos con 74 la numeración es consecutiva los agrupa el libro de inscripción o libro de votación que esa si es por tu zona de inscripción, así que podría darse el caso de existir el 11111111 aunque el 99999999 no creo que sea valido.

Saludos


--
Daniel Sánchez Escobar
Investigación y Desarrollo
Reset Software & Sistemas
Móvil +051-949398047
Trujillo - Perú

Miguel

unread,
Jun 14, 2012, 2:08:30 PM6/14/12
to Comunidad de Visual Foxpro en Español
¿?

Samuel San Miguel Hernández

unread,
Jun 14, 2012, 3:09:23 PM6/14/12
to publice...@googlegroups.com
Hola Daniel, en pocas palabras no existe un algoritmo, verdad??
Miguel, ese algoritmo es como el que tenemos aca en Perú para validar el RUC de una empresa, yo necesitaba para su DNI de una persona.

Gracias.
Saludos.

Samuel San Miguel Hernández

unread,
Jun 14, 2012, 3:11:38 PM6/14/12
to publice...@googlegroups.com
Por fín,, ya tengo acceso a publicar respuestas en el trabajo...
:)


El jueves, 14 de junio de 2012 13:08:30 UTC-5, Miguel escribió:

Carlos Miguel FARIAS

unread,
Jun 14, 2012, 5:43:56 PM6/14/12
to publice...@googlegroups.com
Un número identificador, para ser verficado, tiene que tener algún componente adicional (1 o más dígitos) que puedan obtenerse a partir de algún algoritmo aplicado sobre sus cifras, si no, no puede ser verificado.
Pero ojo, digo verificado, esto significa que con algún grado de certeza, las cifras fueron cargadas (digitadas) apropiadamente. El RUC o el CUIT, tiene agregados esos dígitos que permiten su verificación. O sea, se verifica que se un valor factible, correctamente cargado.
Esto no quiere decir que el número este VALIDADO, o sea, que corresponda a alguna entidad (persona, ente [o también enta, en Argentina], empresa, etc.) realmente existente.
Para ello, indefectiblemente, la validacion deberá hacerse contra un "padrón" o catastro, que tenga los valores reales.
Saludos: Miguel, La Pampa (RA)

Miguel

unread,
Jun 15, 2012, 3:01:39 AM6/15/12
to Comunidad de Visual Foxpro en Español
Hola Samuel,

Perdona, pero este código incorpora todos los casos que existen en
España: Varios tipos de sociedades, y personas físicas, tanto
extranjeros como nacionales.

La primera parte del if principal es para sociedades y a partir del
else para el dni, que en España incorpora al final una letra que es
carácter de control para determinar si es correcto o no.

La primera parte también se subdivide en 2. La primera-primera parte
es para empresas y la segunda-primera parte es para el nif de los
extranjeros, porque ellos llevan una letra al principio y una "X" creo
que al final.

Para saber si funciona o no, lo mejor es que hagas un simple prueba:
le pases tu propio dni y te dirá si es incorrecto, en caso contrario
no responde nada.

Ya me dirás si te ha funcionado, en caso contrario es porque la forma
de codificarlo de tu país es diferente.

Saludos,
Miguel

On 14 jun, 21:09, Samuel San Miguel Hernández
> > > Trujillo - Perú- Ocultar texto de la cita -

Moises Daniel Vilchez Tello

unread,
Jun 15, 2012, 10:06:27 AM6/15/12
to publice...@googlegroups.com
saludos, aqui en mi trabajo un compañero que tiene el algoritmo en C#, por la tarde me a prometido pasarme dicho codigo, ahi lo posteo, saludos


--
Moises Daniel Vilchez Tello
Chiclayo - Lambayeque - Peru

Carlos E. I. Espinoza

unread,
Jul 4, 2012, 8:56:52 AM7/4/12
to publice...@googlegroups.com

Que tal amigo podrias compartir el codigo para validar nro de dni que esta en c sharp y yo lo paso a visual fopxro.
 
Gracias

Samuel San Miguel Hernández

unread,
Jul 4, 2012, 10:15:54 AM7/4/12
to publice...@googlegroups.com
Excelente Moises.
Gracias.

ZeRoberto

unread,
Jul 4, 2012, 4:10:15 PM7/4/12
to publice...@googlegroups.com
Y que fue encontraste algun algoritmo de validacion? me parece que es el mismomodulo 11 para Ruc
 
Saludos

pablo b(La Pampa)

unread,
Jul 6, 2012, 9:20:03 AM7/6/12
to publice...@googlegroups.com
Hola samuel, seguramente esto ya lo vistes o lo sabes, a ver entiendo, aca en argentina hay un algoritmo para saber si el  CUIT de una perona es valido o no, cero que es algo asi como RUC en tu pais, si es asi, el link que te paso abajo te sirve seguro, sino avisame y le consulto a un colega peruano tb. Saludos pablo

https://groups.google.com/forum/?hl=es&fromgroups#!searchin/publicesvfoxpro/dni$20peru/publicesvfoxpro/JOgQ6WVPiyU/GlARRd5qN0QJ

Pablo

Samuel San Miguel Hernández

unread,
Jul 6, 2012, 10:44:58 AM7/6/12
to publice...@googlegroups.com
Hola Pablo,
esta bueno ese código, sin embargo, la idea es validar colocando sólo el DNI, no utilzando el RUC; es decir validar DNI's

Gracias.

ZeRoberto

unread,
Aug 10, 2012, 7:31:21 PM8/10/12
to publice...@googlegroups.com
Aca dejo este codigo para los que quieran validar el DNI pero ojo para poder validar se tiene que ingresar el Numero DNI mas el digito de verificacion.
 
? CheckDni("011637057")

*/-- Verificador y Generador de DNI peruano: Antiguos y Nuevos
Function CheckDNI
LParameters tcDni, tlGenera, tlNumero
Local luResult, lnTotal, lnIndex, lnFactor, lnDigito, lnPosicion, lnNumero, lcNumeros, lcLetra, lcLetras
    tlGenera = Iif(Vartype(tlGenera) == "L", tlGenera, .F.)
    tlNumero = Iif(Vartype(tlNumero) == "L", tlNumero, .F.)
   
    If !tlGenera And Len(tcDni) != 9
       Return .T.
    EndIf
  
    lcLetras  = "KABCIEFGHI" && Antiguo DNI
    lcNumeros = "6789011234" && Nuevo DNI
   
    lnTotal   = 0
    For lnIndex = 1 To 8
        lnFactor = Int(Val(Substr("32765432", lnIndex, 1)))
        lnDigito = Int(Val(Substr(tcDni, lnIndex, 1)))
        lnTotal  = lnTotal + (lnFactor * lnDigito)
    EndFor
    lnPosicion = 11 - Mod(lnTotal, 11)
    If lnPosicion = 11
       lnPosicion = 0
     Else
       If lnPosicion = 10
          lnPosicion = 1
       EndIf
    EndIf
    lnNumero = Int(Val(Substr(lcNumeros, lnPosicion + 1, 1)))
    lcLetra  = Substr(lcLetras, lnPosicion + 1, 1)
    If tlGenera
       If tlNumero
          luResult = lnNumero
        Else
          luResult = lcLetra
       EndIf
     Else
       luCheck = Right(tcDni, 1)
       If IsAlpha(luCheck)
          luResult = luCheck == lcLetra
        Else
          luCheck  = Int(Val(luCheck))
          luResult = luCheck == lnNumero
       EndIf
    EndIf
Return (luResult)
 
Saludos
Roberto Reategui Kanashiro

Daniel Sánchez

unread,
Aug 11, 2012, 12:45:39 AM8/11/12
to publice...@googlegroups.com
Que tal Zeroberto, he estado probando el código que has proporcionado sobre la validación del DNI de Perú, y no funciona con todos los DNI, ingrese los DNI de mi familia, el mio su código de verificación es A y me dice correcto, me emocione dije excelente, probé con el de mi hija cuyo dígito de verificación es 5 y me dice que no es un DNI, retorna falso, el de mi hijo que termina con 3 me dice que es un DNI correcto, pues ademas te comentare que el número de los DNI de mis 2 menores hijos son consecutivos una termina en 90 - 5 y el otro en 91 - 3 con su supuesto código de verificación después del guion, y son consecutivos ya que ambos se inscribieron juntos, y debo suponer que la persona que sigue debe seguir con la numeración siguiente. No se que opinas al respecto.

ZeRoberto

unread,
Aug 11, 2012, 11:47:15 AM8/11/12
to publice...@googlegroups.com
Hola Daniel

Dime con cuantos DNIs probaste y con cuantos funcionaron, y si
pudieras pasarme alguno con los que no funciono para revisarlo.

A ver prueba validandolo aca para ver si es correcto
https://cel.reniec.gob.pe/valreg/valreg.do

Saludos

El 11/08/12, Daniel Sánchez <resets...@gmail.com> escribió:
> --
>
>
>
>
Reply all
Reply to author
Forward
0 new messages