domingo, 8 de mayo de 2011

Algoritmo de Verificacion de Cedula Ecuatoriana

Hace algún tiempo estuve buscando algo sobre la verificación de este tipo de identificacion pero encontré ciertas implementaciones no óptimas y por eso decidí investigar como se lo hacia manualmente, el proceso es el siguiente:

-      La cedula ecuatoriana está formada por los dos primeros dígitos que corresponden a la provincia donde fue expedida, por lo cual los dos primeros números no será mayor a 24 ni menor a 1.

-       El tercer digito es un número menor a 6 (0, 1, 2, 3, 4, 5).

-      Los siguientes hasta el noveno digito son un número consecutivo.

-      Y el décimo digito es el digito verificador.

Los coeficientes usados para verificar el décimo dígito de la cédula, mediante el algoritmo “Módulo 10”

COEFICIENTES = 2.1.2.1.2.1.2.1.2



C#:
Visual Studio 2010 framework 4.0

JAVA: Neetbeans 7.0




32 comentarios:

  1. Muchas gracias, me sirvio mucho, justo lo que necesitaba, con exepcion del codigo de ruc publico, no valida correctamente, pero lo demas muy bueno, gracias

    ResponderEliminar
    Respuestas
    1. Me da gusto que te haya servido !!!
      El codigo de ruc publico lo voy a revisar

      Eliminar
  2. La más didactica de explicaciones. Gracias !

    ResponderEliminar
  3. Muy bueno tu aporte, les dejo el enlace del documento directo del SRI donde indica los pasos para la verificacion de la cedula, ruc, juridico, publico y persona natural

    http://www.sri.gob.ec/DocumentosAlfrescoPortlet/descargar/11a5917c-ea28-46f8-bb19-3737bf6cd07b/Estructura+del+RUC.doc

    ResponderEliminar
  4. esto es lo q he estado necesitando,,, me gustaria q me ayuden..porq me sale error: no todas las rutas de codigo devuelven un valor

    ---public bool VerificaCedula(string ced)----





    ResponderEliminar
  5. Podrian ayudarme con el codigo en javascript?

    ResponderEliminar
  6. Si alguien necesita en Filemaker el Algoritmo de Verificacion de Cedula Ecuatoriana:
    Let ( [
    digitos = Length ( Cedula_ID ) ;
    provincia = Left ( Cedula_ID ; 2 ) ;
    tercer_digito = Middle ( Cedula_ID ; 3 ; 1 ) ;
    ult_digito = Right ( Cedula_ID ; 1 ) ;
    digito_verificador = Let ( [ suma_digitos = Let ( [
    suma_pares = Let ( [ digito2 = Middle ( Cedula_ID ; 2 ; 1 ) ;
    digito4 = Middle ( Cedula_ID ; 4 ; 1 ) ;
    digito6 = Middle ( Cedula_ID ; 6 ; 1 ) ;
    digito8 = Middle ( Cedula_ID ; 8 ; 1 ) ] ; Sum ( digito2 ; digito4 ; digito6 ; digito8 )
    ) ;
    suma_impares = Let ( [ digito1 = If ( 2 * Middle ( Cedula_ID ; 1 ; 1 ) > 9 ; 2 * Middle ( Cedula_ID ; 1 ; 1 ) - 9 ; 2 * Middle ( Cedula_ID ; 1 ; 1 ) ) ;
    digito3 = If ( 2 * Middle ( Cedula_ID ; 3 ; 1 ) > 9 ; 2 * Middle ( Cedula_ID ; 3 ; 1 ) - 9 ; 2 * Middle ( Cedula_ID ; 3 ; 1 ) ) ;
    digito5 = If ( 2 * Middle ( Cedula_ID ; 5 ; 1 ) > 9 ; 2 * Middle ( Cedula_ID ; 5 ; 1 ) - 9 ; 2 * Middle ( Cedula_ID ; 5 ; 1 ) ) ;
    digito7 = If ( 2 * Middle ( Cedula_ID ; 7 ; 1 ) > 9 ; 2 * Middle ( Cedula_ID ; 7 ; 1 ) - 9 ; 2 * Middle ( Cedula_ID ; 7 ; 1 ) ) ;
    digito9 = If ( 2 * Middle ( Cedula_ID ; 9 ; 1 ) > 9 ; 2 * Middle ( Cedula_ID ; 9 ; 1 ) - 9 ; 2 * Middle ( Cedula_ID ; 9 ; 1 ) ) ] ; Sum ( digito1 ; digito3 ; digito5 ; digito7 ; digito9 )
    )
    ] ; Sum ( suma_pares ; suma_impares ) )

    ] ; If ( ( 1 + Left ( suma de pares e impares ; 1 ) ) * 10 - suma de pares e impares = 10 ; 0 ; ( 1 + Left ( suma de pares e impares ; 1 ) ) * 10 - suma de pares e impares ) )

    ] ; digitos = 10 and provincia ≥ 1 and provincia ≤ 24 and tercer_digito ≥ 0 and tercer_digito ≤ 5 and ult_digito = digito_verificador
    )

    ResponderEliminar
  7. Este comentario ha sido eliminado por el autor.

    ResponderEliminar
  8. Estimado, tienes talvez ya con la validación del RUC publico??
    Gracias tu ayuda.

    ResponderEliminar
  9. El algoritmo no funciona cuando la suma de todos los resultados es menor de 10. Ejemplo con la cedula 0202016051.
    En este caso el dígito verificador es 1 pero el calculado es 9.
    Usar ese calculo (c#):
    var digitoVerificadorObtenido = (total % 10) != 0 ? 10 - (total % 10) : 0;

    ResponderEliminar
    Respuestas
    1. es por que tu cedula esta mal, no es correcta. A partir del 4to digito:
      "Los siguientes hasta el noveno digito son un número consecutivo."
      Pon una cédula correcta.

      Eliminar
    2. La cédula esta bien, la suma de los dígitos da 9, la siguiente decena es 10 y 10-9=1 que es el dígito verificador, cuando se dice que desde el cuarto dígito al noveno son consecutivos se refiere a que el registro civil asigna estos dígitos de forma consecutiva.

      Eliminar
    3. La cédula esta bien, la suma de los dígitos da 9, la siguiente decena es 10 y 10-9=1 que es el dígito verificador, cuando se dice que desde el cuarto dígito al noveno son consecutivos se refiere a que el registro civil asigna estos dígitos de forma consecutiva.

      Eliminar
  10. me da un error en netbeans de "no main class found"
    alguien me ayuda porfavor

    ResponderEliminar
  11. pero en visual basic 6.0 como es eso

    ResponderEliminar
  12. muy buenA LA EXPLICACION

    ResponderEliminar
  13. Me puedes decir qué algoritmo se usaría para este RUC: 0960036879001, es el ruc de una persona natural extranjera.

    ResponderEliminar
  14. Yo hice este ojala y les sirva es para los tres tipos de cedula. C#
    public bool validacedula(string cedula)
    {
    int numv = 10;
    int div = 11;
    int[] coeficientes;
    if (int.Parse(cedula[2].ToString()) < 6) { coeficientes = new int[] { 2, 1, 2, 1, 2, 1, 2, 1, 2 }; div = 10; }
    else
    {
    if (int.Parse(cedula[2].ToString()) == 6)
    {
    coeficientes = new int[] { 3, 2, 7, 6, 5, 4, 3, 2 };
    numv = 9;
    }
    else coeficientes = new int[] { 4, 3, 2, 7, 6, 5, 4, 3, 2 };
    }
    int total = 0;
    int numprovincia = 24;
    int calculo = 0;
    cedula = cedula.Replace("-", "");
    char[] valores = cedula.ToCharArray(0,9);

    if (((Convert.ToInt16(valores[2].ToString()) <= 6) || (Convert.ToInt16(valores[2].ToString()) == 9)) && (Convert.ToInt16(cedula.Substring(0, 2)) <= numprovincia))
    {
    for (int i = 0; i < numv-1; i++)
    {
    calculo = (Convert.ToInt16(valores[i].ToString())) * coeficientes[i];
    if (div==10) total +=calculo>9?calculo-9:calculo;
    else total +=calculo;
    }
    return (div-(total % div)) >=10? 0==Convert.ToInt16(cedula[numv-1].ToString()):(div-(total % div)) == Convert.ToInt16(cedula[numv-1].ToString());
    }
    else return false;
    }

    ResponderEliminar
    Respuestas
    1. Este comentario ha sido eliminado por el autor.

      Eliminar
    2. necesito esto en sql por favor

      Eliminar
  15. Muy útil, será que me puedes ayudar con el código para Acess 2013

    ResponderEliminar
  16. Mis correos:alfaro_contador@hotmail.com o al cfalfarog@gmail.com

    ResponderEliminar
  17. podria ser realizado en python..??...seria de muchisima ayuda

    ResponderEliminar
    Respuestas
    1. def idverifier(IDstring):
      if (len(IDstring) == 10):
      mult = 0
      for i in range(len(IDstring)):
      if (i % 2 == 0):
      if (2 * int(IDstring[i]) > 9):
      mult += (2 * int(IDstring[i])) - 9
      else:
      mult += 2 * int(IDstring[i])
      elif (i == 9):
      if ((10 - (mult%10)) == int(IDstring[i])):
      print "La cédula es correcta"
      else:
      print "La cédula es incorrecta"
      else:
      mult += int(IDstring[i])
      else:
      print "La cédula debe tener solo 10 números"
      return None

      Eliminar
  18. hola me guwsto mucho tu explicaicon me ayudo bastante pero te tengo una pregunta a aver si me puedes ayudar... yo estoy desarrollado el softwar en visual basic 6.o y estoy usando la funcion mid.... sabes por que cuando la cedula empieza con el numero 0 este metodo no vale

    ResponderEliminar
  19. Hay algún dígito que diga si la cédula pertenece a un extranjero residente o a un ciudadano??

    ResponderEliminar
  20. Hay algún dígito que diga si la cédula pertenece a un extranjero residente o a un ciudadano??

    ResponderEliminar
  21. vale verga :) cristo te ama

    ResponderEliminar
  22. hola me podrias ayudar para hacerlo en dfd :(

    ResponderEliminar
  23. Este comentario ha sido eliminado por el autor.

    ResponderEliminar