Skip to content

Instantly share code, notes, and snippets.

@vickoman
Created December 5, 2013 05:53
Show Gist options
  • Star 12 You must be signed in to star a gist
  • Fork 9 You must be signed in to fork a gist
  • Save vickoman/7800717 to your computer and use it in GitHub Desktop.
Save vickoman/7800717 to your computer and use it in GitHub Desktop.
Algoritmo para validar cedulas ecuatorianas.
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>
<script>
$(function(){
/**
* Algoritmo para validar cedulas de Ecuador
* @Author : Victor Diaz De La Gasca.
* @Fecha : Quito, 15 de Marzo del 2013
* @Email : vicmandlagasca@gmail.com
* @Pasos del algoritmo
* 1.- Se debe validar que tenga 10 numeros
* 2.- Se extrae los dos primero digitos de la izquierda y compruebo que existan las regiones
* 3.- Extraigo el ultimo digito de la cedula
* 4.- Extraigo Todos los pares y los sumo
* 5.- Extraigo Los impares los multiplico x 2 si el numero resultante es mayor a 9 le restamos 9 al resultante
* 6.- Extraigo el primer Digito de la suma (sumaPares + sumaImpares)
* 7.- Conseguimos la decena inmediata del digito extraido del paso 6 (digito + 1) * 10
* 8.- restamos la decena inmediata - suma / si la suma nos resulta 10, el decimo digito es cero
* 9.- Paso 9 Comparamos el digito resultante con el ultimo digito de la cedula si son iguales todo OK sino existe error.
*/
var cedula = '0931811087';
//Preguntamos si la cedula consta de 10 digitos
if(cedula.length == 10){
//Obtenemos el digito de la region que sonlos dos primeros digitos
var digito_region = cedula.substring(0,2);
//Pregunto si la region existe ecuador se divide en 24 regiones
if( digito_region >= 1 && digito_region <=24 ){
// Extraigo el ultimo digito
var ultimo_digito = cedula.substring(9,10);
//Agrupo todos los pares y los sumo
var pares = parseInt(cedula.substring(1,2)) + parseInt(cedula.substring(3,4)) + parseInt(cedula.substring(5,6)) + parseInt(cedula.substring(7,8));
//Agrupo los impares, los multiplico por un factor de 2, si la resultante es > que 9 le restamos el 9 a la resultante
var numero1 = cedula.substring(0,1);
var numero1 = (numero1 * 2);
if( numero1 > 9 ){ var numero1 = (numero1 - 9); }
var numero3 = cedula.substring(2,3);
var numero3 = (numero3 * 2);
if( numero3 > 9 ){ var numero3 = (numero3 - 9); }
var numero5 = cedula.substring(4,5);
var numero5 = (numero5 * 2);
if( numero5 > 9 ){ var numero5 = (numero5 - 9); }
var numero7 = cedula.substring(6,7);
var numero7 = (numero7 * 2);
if( numero7 > 9 ){ var numero7 = (numero7 - 9); }
var numero9 = cedula.substring(8,9);
var numero9 = (numero9 * 2);
if( numero9 > 9 ){ var numero9 = (numero9 - 9); }
var impares = numero1 + numero3 + numero5 + numero7 + numero9;
//Suma total
var suma_total = (pares + impares);
//extraemos el primero digito
var primer_digito_suma = String(suma_total).substring(0,1);
//Obtenemos la decena inmediata
var decena = (parseInt(primer_digito_suma) + 1) * 10;
//Obtenemos la resta de la decena inmediata - la suma_total esto nos da el digito validador
var digito_validador = decena - suma_total;
//Si el digito validador es = a 10 toma el valor de 0
if(digito_validador == 10)
var digito_validador = 0;
//Validamos que el digito validador sea igual al de la cedula
if(digito_validador == ultimo_digito){
console.log('la cedula:' + cedula + ' es correcta');
}else{
console.log('la cedula:' + cedula + ' es incorrecta');
}
}else{
// imprimimos en consola si la region no pertenece
console.log('Esta cedula no pertenece a ninguna region');
}
}else{
//imprimimos en consola si la cedula tiene mas o menos de 10 digitos
console.log('Esta cedula tiene menos de 10 Digitos');
}
});
</script>
@aichholzer
Copy link

aichholzer commented Sep 24, 2018

@vickoman tu solución es demasido complicada, aquí un par de ejemplos más simples (y mucho más rápidos):
https://gist.github.com/aichholzer/de4c40bac4879210eff42756ad113221

@almendieta
Copy link

Gracias! Funciona perfectamente, y el código es totalmente legible, incluso para convertirlo a otros lenguajes de programación, como .net

@DiegoBSC
Copy link

Solo una observación en los comentarios dices que los pares sumas y los impares realizas la multiplicación y restas en caso de ser así, pero se supone que en los pares deberías hacer ese calculo.
Saludos.

@alekir66
Copy link

Hola está genial. Una contribución: en los primeros dos dígitos de región se debe añadir 30 correspondiente a registro de cédulas de ecuatorianos en el exterior. Adjunto prints de pantalla que validan esa información:
cedula30_3
cedula30_2
cedula30_1

@jlgranda
Copy link

No funciona para el caso: 0910985993

@fizzvr
Copy link

fizzvr commented Jan 27, 2022

Excelente información de @alekir66 🍻

@fizzgc
Copy link

fizzgc commented Mar 22, 2022

Como dato adicional implementar la validación del RUC

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment