Created
December 5, 2013 05:53
-
-
Save vickoman/7800717 to your computer and use it in GitHub Desktop.
Algoritmo para validar cedulas ecuatorianas.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<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 : [email protected] | |
* @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> |
Gracias! Funciona perfectamente, y el código es totalmente legible, incluso para convertirlo a otros lenguajes de programación, como .net
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.
No funciona para el caso: 0910985993
Excelente información de @alekir66 🍻
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
@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