México -> CURP

Post Reply
User avatar
Luis Krause
Posts: 59
Joined: Tue Oct 11, 2005 1:39 am
Location: Vancouver, Canada

México -> CURP

Post by Luis Krause »

Esta es pregunta para compatriotas de México:

¿Alguien tiene el algoritimo para calcular el CURP?

Gracias,

Luis Krause
"May the Source be with GNU"
isolis
Posts: 3
Joined: Wed Jun 28, 2006 4:12 pm
Location: Cancún, México
Contact:

Cálculo CURP México

Post by isolis »

Espero te sirva...

Saludos!!

Code: Select all

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* FUNCION    : CURP([cCURP] [, cPaterno] [, cMaterno] [, cNombre];
*                   [, fNacimiento] [, nSexo] [, cLugarNacim]) -> cCURP
* DESCRIPCION: La Clave Unica de Registro de Población (CURP) es un instrumento de registro e identificación
*              que se asigna a todas las personas que viven en el territorio nacional, así como a los
*              mexicanos que residen en el extranjero.
*              El Registro Nacional de Población (RENAPO) es la instancia responsable de asignar la
*              CURP y de expedir la constancia respectiva.
*              La CURP se integra de dieciocho elementos, representados por letras y números, que se
*              generan a partir de los datos contenidos en el docuemento probatorio de entidad (acta de
*              nacimiento, carta de naturalización o docuemento migratorio), y que se refieren a:
* PARAMETROS : <cCURP>       = Si ya tiene formado parte de la CURP, se deberá pasar en este parámetro y
*                              así sólo anexar la parte faltante.
*              <cPaterno>    = Apellido Paterno                <cMaterno>   = Apellido Materno
*              <cNombre>     = Nombre de Pila                  <fNacimiento>= Fecha de Nacimiento
*              <nSexo>       = _: 1 para Femenino, 2 para Masculino
*              <cLugarNacim> = Clave de la Entidad Federativa de nacimiento.
* REGRESA    : Una cadena de 18 caracteres que contiene parte ó toda la CURP, según los parámetros enviados.
* EJEMPLO    : ? CURP(, "Alamán", "Pérez", "Ricardo", CTOD("21/03/63"), 2, "DF")
*              -> "AAPR630321HDFLRC09"   // Se forma la CURP Completa.
*              ? CURP(, "Alamán", "Pérez", "Ricardo")
*              -> "AAPR         LRC  "   // Se forma sólo la parte de la CURP donde intervienen los apellidos y el nombre.
* EJEMPLO    : ? CURP(, , , , CTOD("21/03/63"), 2, "DF")
*              -> "    630321HDF     "   // Se forma sólo la parte de la CURP donde intervienen la fecha de Nacimiento, el _ y Lugar de Nacimiento.
* REQUIERE   : EsVocal(), EsConsonante(), SinAcento() y FormFec() -> Sanroms.Prg
*
FUNCTION CURP(cCURP, cPaterno, cMaterno, cNombre, fNacimiento, nSexo, cLugarNacim, lVerif)
  LOCAL cConsonante, cElement, cLetra, cPalabra, cVerif, cVocal
  LOCAL nLetra
  LOCAL aAntiSonantes := {"BUEI",;
                          "BUEY",;
                          "CACA",;
                          "CACO",;
                          "CAGA",;
                          "CAGO",;
                          "CAKA",;
                          "CAKO",;
                          "COGE",;
                          "COJA",;
                          "COJE",;
                          "COJI",;
                          "COJO",;
                          "CULO",;
                          "FETO",;
                          "GUEY",;
                          "JOTO",;
                          "KACA",;
                          "KACO",;
                          "KAGA",;
                          "KAGO",;
                          "KAKA",;
                          "KOGE",;
                          "KOJO",;
                          "KULO",;
                          "LOCA",;
                          "LOCO",;
                          "LOKA",;
                          "LOKO",;
                          "MAME",;
                          "MAMO",;
                          "MEAR",;
                          "MEAS",;
                          "MEON",;
                          "MION",;
                          "MOCO",;
                          "MULA",;
                          "PEDA",;
                          "PEDO",;
                          "PENE",;
                          "PUTA",;
                          "PUTO",;
                          "QULO",;
                          "RATA",;
                          "ROBE",;
                          "RUIN",;
                          "VAGA",;
                          "VAGO"}

  DEFAULT cCURP := SPACE(18)
  DEFAULT lVerif:= .F.

  IF !EMPTY(cPaterno)
     cPaterno := AnsiUpper( ALLTRIM(cPaterno) )
     // 1.- Inicial del primer apellido...
     cLetra:= SinAcento( SUBSTR(cPaterno, 1, 1) )
     cCURP := STUFF(cCURP, 1, 1, IIF(cLetra = "Ñ", "X", cLetra)) // Las "Ñ" no son permitidas, en lugar de ésta una "X".

     // 2.- Primera vocal interna del primer apellido...
     // ** Si el primer apellido NO tiene Vocal Interna: Se deberá anotar una "X" **
     cVocal := "X"
     FOR nLetra := 2 TO LEN(cPaterno)
         cLetra := SUBSTR(cPaterno, nLetra, 1)
         IF EsVocal(cLetra)
            cVocal := SinAcento(cLetra)
            EXIT
         ENDIF
     NEXT
     cCURP := STUFF(cCURP, 2, 1, cVocal)
  ENDIF


  IF cMaterno <> NIL
     cMaterno := AnsiUpper( ALLTRIM(cMaterno) )
     // 3.- Inicial del segundo apellido...
     IF !EMPTY(cMaterno)
        cLetra:= SinAcento( SUBSTR(cMaterno, 1, 1) )
     ELSE
        cLetra := "X" // ** Si NO Existe segundo apellido: Se deberá anotar una "X".
     ENDIF
     cCURP := STUFF(cCURP, 3, 1, IIF(cLetra = "Ñ", "X", cLetra))
  ENDIF


  IF !EMPTY(cNombre)
     cNombre := SinAcento(AnsiUpper( ALLTRIM(cNombre) ))
     IF StrWord(cNombre) > 1    // Se verifica si el nombre está formado por más de una palabra...
        DO CASE
           CASE "JOSE" IN cNombre
                cNombre := StrTran(cNombre, "JOSE")
           CASE "MARIA" IN cNombre
                cNombre := StrTran(cNombre, "MARIA")
        ENDCASE
     ENDIF
     cNombre := ALLTRIM(cNombre)
     // 4.- Inicial del nombre de pila.
     cLetra:= LEFT(cNombre, 1)
     cCURP := STUFF(cCURP, 4, 1, IIF(cLetra = "Ñ", "X", cLetra)) // Las "Ñ" no son permitidas, en lugar de ésta una "X".
  ENDIF


  // Se verifica que no se haya formado una palabra Anti-sonante...
  cPalabra := SUBSTR(cCURP, 1, 4)
  FOR EACH cElement IN aAntiSonantes
      IF cPalabra == cElement
         cCURP := STUFF(cCURP, 2, 1, "X")   // Se pone una "X" en la posición 2 de la palabra Anti-sonante.
         EXIT
      ENDIF
  NEXT


  IF !EMPTY(fNacimiento)
     // 5.- Fecha de nacimiento: año, mes y día.
     cCURP := STUFF(cCURP, 5, 6, FormFec("[A][M][DDD]", fNacimiento))
  ENDIF


  IF !EMPTY(nSexo)
     // 6.- _: (H) para hombre y (M) para mujer.
     cCURP := STUFF(cCURP, 11, 1, IIF(nSexo = 1, "M", "H"))
  ENDIF


  IF !EMPTY(cLugarNacim)
     cLugarNacim := UPPER(cLugarNacim)
     // 7.- Entidad federativa de nacimiento.
     cCURP := STUFF(cCURP, 12, 2, cLugarNacim)
  ENDIF


  IF !EMPTY(cPaterno)
     // 8.- Primera consonante interna del primer apellido.
     // ** En caso de NO existir Consonantes Internas en el primer apellido: Se colocará una "X" **
     cConsonante := "X"
     FOR nLetra := 2 TO LEN(cPaterno)
         cLetra := SUBSTR(cPaterno, nLetra, 1)
         IF EsConsonante(cLetra)
            cConsonante := cLetra
            EXIT
         ENDIF
     NEXT
     cCURP := STUFF(cCURP, 14, 1, IIF(cConsonante = "Ñ", "X", cConsonante))
  ENDIF


  IF cMaterno <> NIL
     // 9.- Primera consonante interna del segundo apellido.
     cConsonante := "X"
     IF !EMPTY(cMaterno)
        FOR nLetra := 2 TO LEN(cMaterno)
            cLetra := SUBSTR(cMaterno, nLetra, 1)
            IF EsConsonante(cLetra)
               cConsonante := cLetra
               EXIT
            ENDIF
        NEXT
     ENDIF
     cCURP := STUFF(cCURP, 15, 1, IIF(cConsonante = "Ñ", "X", cConsonante))
  ENDIF


  IF !EMPTY(cNombre)
     // 10.- Primera consonante interna del nombre de pila.
     cConsonante := "X"
     FOR nLetra := 2 TO LEN(cNombre)
         cLetra := SUBSTR(cNombre, nLetra, 1)
         IF EsConsonante(cLetra) .AND. cLetra <> "Ñ"
            cConsonante := cLetra
            EXIT
         ENDIF
     NEXT
     cCURP := STUFF(cCURP, 16, 1, cConsonante)
  ENDIF


  IF lVerif // Cálculo de dígitos verificadores...
     cCURP := SUBSTR(cCURP, 1, 16)
     cVerif:= CURPVerif(cCURP + "0")
     cCURP := STUFF(cCURP, 17, 2, cVerif)
  ENDIF
RETURN (cCURP)
*
* FIN CURP()
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
Francisco Horta
Posts: 845
Joined: Sun Oct 09, 2005 5:36 pm
Location: la laguna, mexico.

Post by Francisco Horta »

por aqui dejo un link que habia encontrado

http://mx.geocities.com/fjgm07/rfc.txt

salu2
paco
User avatar
Luis Krause
Posts: 59
Joined: Tue Oct 11, 2005 1:39 am
Location: Vancouver, Canada

Re: Cálculo CURP México

Post by Luis Krause »

Israel,

Mil gracias, ya lo pruebo.

Aunque las tres primeras son fáciles de inferir... ¿podrás compartir?

EsVocal(), EsConsonante(), SinAcento(), FormFec() y CURPVerif()

Gracias.
isolis wrote:Espero te sirva...

Saludos!!
Last edited by Luis Krause on Mon Jul 23, 2007 7:32 pm, edited 2 times in total.
"May the Source be with GNU"
User avatar
Luis Krause
Posts: 59
Joined: Tue Oct 11, 2005 1:39 am
Location: Vancouver, Canada

Post by Luis Krause »

Paco:

Gracias por la liga.
Francisco Horta wrote:por aqui dejo un link que habia encontrado

http://mx.geocities.com/fjgm07/rfc.txt

salu2
paco
"May the Source be with GNU"
isolis
Posts: 3
Joined: Wed Jun 28, 2006 4:12 pm
Location: Cancún, México
Contact:

Post by isolis »

Luis:

EsVocal(), EsConsonante() y SinAcento()

SALUDOS!!

Code: Select all

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* FUNCION    : EsVocal(cLetra) -> lVocal
* DESCRIPCION: Investiga si un caracter es Vocal, aún cuando se encuentre acentuada.
* REGRESA    : .T. si el caracter es Vocal, en caso contrario devuelve .F.
* PARAMETROS : <cLetra> = Caracter a investigar si se trata de una vocal.
* EJEMPLO    : ? EsVocal("a") -> .T.            ? EsVocal("8") -> .F.
*              ? EsVocal("ú") -> .T.            ? EsVocal("P") -> .F.
*              ? EsVocal("E") -> .T.            ? EsVocal("=") -> .F.
* REQUIERE   : SinAcento() -> Sanroms.Prg
*
FUNCTION EsVocal(cLetra)
  DEFAULT cLetra := SPACE(1)

  IF VALTYPE(cLetra) <> "C" // Valida que el parámetro pasado se trate de un caracter.
     cLetra := SPACE(1)
  ENDIF

  cLetra := UPPER(SinAcento( ALLTRIM(cLetra) )) // Anula espacios, quita el acento y convierte a mayúscula para la comparación.

  IF cLetra = "A" .OR. cLetra = "E" .OR. cLetra = "I" .OR.;
     cLetra = "O" .OR. cLetra = "U"
     RETURN(.T.)
  ENDIF

RETURN (.F.)
*
* FIN EsVocal()
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* FUNCION    : EsConsonante(cLetra) -> lConsonante
* DESCRIPCION: Investiga si un caracter es Consonante.
* REGRESA    : .T. si el caracter es Consonante, en caso contrario devuelve .F.
* PARAMETROS : <cLetra> = Caracter a investigar si se trata de una consonante.
* EJEMPLO    : ? EsVocal("P") -> .T.            ? EsVocal("8") -> .F.
*              ? EsVocal("m") -> .T.            ? EsVocal("A") -> .F.
*              ? EsVocal("x") -> .T.            ? EsVocal("=") -> .F.
* REQUIERE   : EsVocal() -> Sanroms.Prg
*
FUNCTION EsConsonante(cLetra)
  DEFAULT cLetra := SPACE(1)

  cLetra := UPPER( ALLTRIM(cLetra) )

  IF cLetra = "B" .OR. cLetra = "C" .OR. cLetra = "D" .OR. cLetra = "F" .OR.;
     cLetra = "G" .OR. cLetra = "H" .OR. cLetra = "J" .OR. cLetra = "K" .OR.;
     cLetra = "L" .OR. cLetra = "M" .OR. cLetra = "N" .OR. cLetra = "Ñ" .OR.;
     cLetra = "P" .OR. cLetra = "Q" .OR. cLetra = "R" .OR. cLetra = "S" .OR.;
     cLetra = "T" .OR. cLetra = "V" .OR. cLetra = "W" .OR. cLetra = "X" .OR.;
     cLetra = "Y" .OR. cLetra = "Z"
     RETURN(.T.)
  ENDIF

RETURN(.F.)
*
* FIN EsConsonante()
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *


* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
* FUNCION    : SinAcento(<cCadena>) -> cCadena
* DESCRIPCION: Quita los acentos a la cadena pasada.
* REGRESA    : <cCadena> pero SIN Acento
* PARAMETROS : <cCadena> = Cadena a eliminarle los acentos.
* EJEMPLO    : ? SinAcento("Sánchez") -> "Sanchez"     ? SinAcento("8") -> "8"
*              ? SinAcento("É") -> "E"                 ? SinAcento("A") -> "A"
*              ? SinAcento("LÓPEZ") -> "LOPEZ"         ? SinAcento("=") -> "="
*
FUNCTION SinAcento(cCadena)
  DEFAULT cCadena := SPACE(1)

  IF VALTYPE(cCadena) <> "C"
     cCadena := SPACE(1)
  ENDIF

  cCadena := StrTran(cCadena, "Á", "A")
  cCadena := StrTran(cCadena, "É", "E")
  cCadena := StrTran(cCadena, "Í", "I")
  cCadena := StrTran(cCadena, "Ó", "O")
  cCadena := StrTran(cCadena, "Ú", "U")
  cCadena := StrTran(cCadena, "á", "a")
  cCadena := StrTran(cCadena, "é", "e")
  cCadena := StrTran(cCadena, "í", "i")
  cCadena := StrTran(cCadena, "ó", "o")
  cCadena := StrTran(cCadena, "ú", "u")

RETURN(cCadena)
*
* FIN SinAcento()
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

User avatar
Luis Krause
Posts: 59
Joined: Tue Oct 11, 2005 1:39 am
Location: Vancouver, Canada

Post by Luis Krause »

Israel:

Si no fuera mucho enchinchar, sería posible CURPVerif() y FormFec()?

Mil gracias,
isolis wrote:Luis:

EsVocal(), EsConsonante() y SinAcento()

SALUDOS!!
"May the Source be with GNU"
isolis
Posts: 3
Joined: Wed Jun 28, 2006 4:12 pm
Location: Cancún, México
Contact:

Post by isolis »

Luis:

Mil disculpas pero te voy a deber la función CURPVerif() ya que el autor no me permite la distibución, esta función solo se encarga de calcular los dígitos verificadores pero obviamente son los que proporciona gobernación los realmente válidos (asignados oficialmente a la persona).

Sobre la función FormFec() es original de Grupo Eidos (Librerias en Clipper 5, Ra-ma, Addison-Wesley Iberoamericana, 1992) y a su vez requiere de varias funciones mas, por lo que sería largo el ponertelas todas aqui, envíame un privado.

SALUDOS!!
ACC69
Posts: 619
Joined: Tue Dec 12, 2006 7:34 pm
Contact:

Hola Israel

Post by ACC69 »

isolis wrote:Luis:

Mil disculpas pero te voy a deber la función CURPVerif() ya que el autor no me permite la distibución, esta función solo se encarga de calcular los dígitos verificadores pero obviamente son los que proporciona gobernación los realmente válidos (asignados oficialmente a la persona).

Sobre la función FormFec() es original de Grupo Eidos (Librerias en Clipper 5, Ra-ma, Addison-Wesley Iberoamericana, 1992) y a su vez requiere de varias funciones mas, por lo que sería largo el ponertelas todas aqui, envíame un privado.

SALUDOS!!
Hola Israel que tal como esta, yo soy un desarrollador de FiveWin que aun me falta mucho por aprender, soy de Cancun, ya tengo desarrollado un sistema de control de proveedores algo parecido a contabiliad de 3 niveles de cuentas y me gustaria intercambiar conocimientos y experiencias se podra ? le dejo mi correo y gusto saludarte y encontrarme alguien de mi misma localidad Cancun :)
Saludos Adriano C. C
acc69@hotmail.com
User avatar
Luis Krause
Posts: 59
Joined: Tue Oct 11, 2005 1:39 am
Location: Vancouver, Canada

Post by Luis Krause »

Israel:

No hay problema.

Saludos,
isolis wrote:Luis:

Mil disculpas pero te voy a deber la función CURPVerif() ya que el autor no me permite la distibución, esta función solo se encarga de calcular los dígitos verificadores pero obviamente son los que proporciona gobernación los realmente válidos (asignados oficialmente a la persona).

Sobre la función FormFec() es original de Grupo Eidos (Librerias en Clipper 5, Ra-ma, Addison-Wesley Iberoamericana, 1992) y a su vez requiere de varias funciones mas, por lo que sería largo el ponertelas todas aqui, envíame un privado.

SALUDOS!!
"May the Source be with GNU"
Post Reply