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




44 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. Hola, tal vez te sirva mi artículo donde detallo los tipos de RUC y sus diferencias, junto con ejemplos personalizados e implementaciones en otros lenguajes, está en https://www.jybaro.com/blog/cedula-de-identidad-ecuatoriana/

      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
    4. mi amigo pedro tiene razón la cédula si es correcta yo ya la comprobé en mi verificador.
      que acabe de crear.

      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
    3. alguien lo tiene en sql?

      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
  24. Gracias por la detallada explicación de cómo validar la cédula, las imágenes son muy claras en el algoritmo y me ha servido de ayuda para un artículo donde detallo un poco más y pongo ejemplos personalizados, si pudieras pasar y comentar cualquier cosa sería genial! Está en https://www.jybaro.com/blog/cedula-de-identidad-ecuatoriana/

    ResponderEliminar
  25. Fue entretenido ggggg...

    https://1drv.ms/u/s!AjSEk3eeQ5-ynQYEPdLhADUfJVr8

    By:

    Li0nle0

    ResponderEliminar
  26. Este es exactamente el código c# del post pero en formtado texto, para que sea facil copiar y pegar. Ojo no tiene la mejora mencioanda por Anónimo17 de octubre de 2014, 9:51.

    public static bool VerificaCdedula(string ced)
    {
    int isNumeric;
    var total = 0;
    const int tamanoLongitudCedula = 10;
    int[] coeficientes = { 2,1,2,1,2,1,2,1,2};
    const int numeroProvincias = 24;
    const int tercerDigito = 6;

    if (int.TryParse(ced, out isNumeric) && ced.Length == tamanoLongitudCedula)
    {
    var provincia = Convert.ToInt32(string.Concat(ced[0], ced[1], string.Empty));
    var digitoTres = Convert.ToInt32(ced[2]+string.Empty);
    if ((provincia > 0 && provincia <= numeroProvincias) && digitoTres < tercerDigito)
    {
    var digitoVerificadorRecibido = Convert.ToInt32(ced[9] + string.Empty);
    for (int k = 0; k < coeficientes.Length; k++)
    {
    var valor = Convert.ToInt32(coeficientes[k] + string.Empty) *
    Convert.ToInt32(ced[k] + string.Empty);
    total = valor > 10 ? total + (valor - 9) : total + valor;
    }
    var digitoVerificadorObtenido = total >= 10 ? (total % 10) != 0 ?
    10 - (total % 10) : (total % 10) : total;
    return digitoVerificadorObtenido == digitoVerificadorRecibido;
    }
    return false;
    }
    return false;
    }

    ResponderEliminar
  27. Si es que alguien lo requiere en PHP esta sería la alternativa:
    Apelando a la funcion validarCI('numero_de_cedula') se reciben los valores true o false dependiendo de si cumple o no con las reglas de validación.

    function validarCI($strCedula)
    {
    if(strlen($strCedula)<10){
    return false;
    }
    if(strlen($strCedula)>10){
    return false;
    }
    $suma = 0;
    $strOriginal = $strCedula;
    $intProvincia = substr($strCedula,0,2);
    $intTercero = $strCedula[2];
    $intUltimo = $strCedula[9];
    if (! settype($strCedula,"float")) return FALSE;
    if ((int) $intProvincia < 1 || (int) $intProvincia > 23) return FALSE;
    if ((int) $intTercero == 7 || (int) $intTercero == 8) return FALSE;
    for($indice = 0; $indice < 9; $indice++) {
    //echo $strOriginal[$indice],'';
    switch($indice) {
    case 0:
    case 2:
    case 4:
    case 6:
    case 8:
    $arrProducto[$indice] = $strOriginal[$indice] * 2;
    if ($arrProducto[$indice] >= 10) $arrProducto[$indice] -= 9;
    //echo $arrProducto[$indice],'';
    break;
    case 1:
    case 3:
    case 5:
    case 7:
    $arrProducto[$indice] = $strOriginal[$indice] * 1;
    if ($arrProducto[$indice] >= 10) $arrProducto[$indice] -= 9;
    //echo $arrProducto[$indice],'';
    break;
    }
    }
    foreach($arrProducto as $indice => $producto) $suma += $producto;
    $residuo = $suma % 10;
    $intVerificador = $residuo==0 ? 0: 10 - $residuo;
    return ($intVerificador == $intUltimo? TRUE: FALSE);
    }

    ResponderEliminar
    Respuestas
    1. Para PHP, cómo le agrego la opción de "consumidor final" con el numero de cédula 9999999999 ???
      gracias.

      Eliminar
  28. En Netbeans me slae un error "class"validación de cédula" does not have a main method" ayuda por favor

    ResponderEliminar
  29. hola amigo el articulo es muy bueno y quisiera saver si puedo correrlo en dev c++ y que bibliotecas o librerias necesito para que me corra el programa

    ResponderEliminar
  30. disculpa si me puedes ayudar con la cedula de ciudadania pero con vectores

    ResponderEliminar
  31. Hola que tal me podrian ayudar con la programacion de la cedula en html se les agracede

    ResponderEliminar