Вы находитесь на странице: 1из 6

Famoso Algoritmo de la CI Uruguaya!!

4 comentarios 17682 visitas 0 distinciones

Bueno seores aca les explico de que se trata esto aunque me imagino que si alguna vez haz programado algo que tenga que ver con usuarios aca en uruguay tendrias que saberlo ya que con este algoritmo se puede controlar si la cedula existe o no, en cualquier lenguaje de programacion obvio XD! yo lo hice en java y me quedo impecable!!!

Una de las cosas que ms llaman la atencin de nuestro documento de identidad es el nmero luego de la barra: 1234567-8 Quiz muchos ya lo sepan, se llama "Digito Verificador y resulta de una serie de clculos con los numeros del documento. El clculo es simple pero entreverado: Se toman los primeros siete numeros y se multiplican cada uno (respetando el lugar, es decir: primero x primero, segundo por segundo) por

2987634.

Ejemplo: 1)Si la cedula es 1234567 la cuenta quedara as: 1x2+2x9+3x8+4x7+5x6+6x3+7x4= 148. 2) Se toma el resultado y se le busca el numero mayor que termina en 0 y se le resta. Ej: 150-148= 2. 3) El nmero 2 es el dgito verificador para la cedula 1234567
Digito verificador cedula uruguaya
por iatech Mi Nov 28, 2012 8:42 pm

Hola a todos esta es mi primer consulta en este foro, estoy necesitando verificar mediante un digito verificador la cedula uruguaya en una celda contigua a donde se ingrese el numero de cedula. A continuacion paso la forma en como se calcula dicho digito verificador. Como calcular el digito verificador de la CI Uruguaya Es el nmero de cdula 1234567-2 es vlido? La Cdula de Identidad de la Repblica Oriental del Uruguay es un documento emitido por la Direccin Nacional de Identificacin Civil quien depende del Ministerio del Interior. Dicho documento tiene como propsito llevar registro de cada individuo sea oriundo o nacionalizado en la repblica. El numero de una cdula de identidad tiene exactamente 7 dgitos al cual se le adiciona un dgito verificador. Es as que un nmero valido debe respetar el siguiente formato: a.bcd.efg-h El dgito posterior al guin (h) es tambin llamado dgito verificador. Para obtener h debemos: Multiplicar a,b,c,d,e,f,g por las siguientes constantes: (a; b; c; d; e; f; g) .* (2; 9; 8; 7; 6; 3; 4) El resultado de la suma s = 2*a + 9*b + 8*c + 7*d + 6*e + 3*f + 4*g es dividido por 10 quedndonos con resto (M = s modulo 10) Finalmente h = (10 M) % 10 Ejemplo practico: Si la CI es 1.234.567: s = 2*1 + 9*2 + 8*3 + 7*4 + 6*5 + 3*6 + 4*7 = 148 M = 148 % 10 = 8 h = (10 8) % 10 = 2 Obteniendo que 1.234.567-2 es un nmero de CI valido. Desde ya agradezco su respuesta y su ayuda en dicho problema para poder encontrar un script o formula para resolverlo

Hace un tiempo hice esta funcin para verificar si un string era una cdula valida
public static bool IsValidaCedula(string cedula) { const string expression = @"(\d)\.(\d)(\d)(\d)\.(\d)(\d)(\d)-(\d)"; Regex r = new Regex(expression, RegexOptions.IgnoreCase | RegexOptions.Compiled); Match m = r.Match(cedula); if (!m.Success) { return false; } int[] vector = { 2, 9, 8, 7, 6, 3, 4 }; int digito = 0; for (int i = 0; i < 7; i++) digito += int.Parse(m.Groups[i + 1].ToString()) * vector[i]; digito = 10 - (digito % 10); return int.Parse(m.Groups[8].ToString()) == digito; } Public Function DigitoVerificador(m As Variant, Optional tick As Control) As Integer Dim xCedula As String, xPatron As String Dim Numero As Integer, x As Integer, Resto As Integer Const Patron = "2987634" n = Left(m, 7) Numero = 0 'Se multiplica la cdula desde atrs hacia adelante

'con el nmero patrn For x = Len(n) To 1 Step -1 xCedula = Val(Mid(n, x, 1)) xPatron = Val(Mid(Patron, x, 1)) Numero = Numero + xPatron * xCedula Next 'Se calcula el Resto a 10 Resto = Numero Mod 10 'Se calcula el dgito verificador If Resto > 0 Then DigitoVerificador = 10 - Resto If DigitoVerificador = Right(m, 1) Then tick.Visible = True Else Call MsgBox("Nmero de cdula incorrecto. Por favor verifique", vbExclamation Or vbSystemModal, App.Title) tick.Visible = False End If Else DigitoVerificador = Resto If DigitoVerificador = Right(m, 1) Then tick.Visible = True Else Call MsgBox("Nmero de cdula incorrecto. Por favor verifique", vbExclamation Or vbSystemModal, App.Title) tick.Visible = False

End If End If

End Function

Algoritmo en JavaScript para validar el Documento de identidad Uruguayo


Publicado por: nprieto23 en: diciembre 27, 2011

En: Programacin y Testing | Tecnologa 13 Comentarios

En primer lugar para los que no lo saben y les interesa saber cual es la lgica atrs del numero de cdula uruguayo les paso a comentar: Clculo del Dgito Verificador Se toman los 7 nmeros de la cdula y se multiplican cada uno por 2987634 uno a uno el primer nmero por el 2, el segundo por el 9 y as sucesivamente, cuando cada resultado supera un dgito, se toma slo la unidad.

Ej.: C.I.: 1.234.567-X -> 2987634 -> 2, 8, 4, 8, 0, 8, 8 Se hace la sumatoria de los resultados, en el ejemplo sera 2+8+4+8+0+8+8=38. Se busca el primer nmero ms grande que 38 que termina en cero y se le resta: 40-38= 2, (es lo mismo que 10-(38 mod 10)). Es x=2 pues, el dgito verificador para la cdula 1.234.567. Otra manera ms simple de verlo es como un producto escalar de vectores en mdulo 10. Las primeras 7 cifras de la cdula pueden verse como un vector de largo 7. Ese vector es multiplicado escalarmente por el vector 8123476 obtenindose un nmero N. El dgito verificador resulta ser N mdulo 10. Ej.: C.I.: 1.234.567-X -> X = [(1x8)+(2x1)+(3x2)+(4x3)+(5x4)+(6x7)+(7x6)] mod 10 -> X = [8+2+6+12+20+42+42] mod 10 = 132 mod 10 = 2 va Documento de identidad Wikipedia, la enciclopedia libre. A continuacin el algoritmo en javascript para validar una cdula uruguaya, lo adapt de uno que encontr hecho en Java, se considera que ci es un parmetro que contiene un nmero de cdula sin puntos ni guiones, esas validaciones deben hacerlas antes de llamar a esta funcin o bien agregarselas a la funcin: function validarCedula(ci){ //Inicializo los coefcientes en el orden correcto var arrCoefs = [2,9,8,7,6,3,4,1]; var suma = 0; //Para el caso en el que la CI tiene menos de 8 digitos //calculo cuantos coeficientes no voy a usar var difCoef = parseInt(arrCoefs.length ci.length); //recorro cada digito empezando por el de ms a la derecha //o sea, el digito verificador, el que tiene indice mayor en el array for (var i = ci.length 1; i > -1; i) { //Obtengo el digito correspondiente de la ci recibida var dig = ci.substring(i, i+1); //Lo tena como caracter, lo transformo a int para poder operar var digInt = parseInt(dig); //Obtengo el coeficiente correspondiente al sta posicin del digito var coef = arrCoefs[i+difCoef]; //Multiplico dgito por coeficiente y lo acumulo a la suma total suma = suma + digInt * coef; } // si la suma es mltiplo de 10 es una ci vlida if ( (suma % 10) == 0 ) { return true; } else { return false;

} }
Clculo del Dgito Verificador' Se toman los 7 nmeros de la cdula y se multiplican cada uno por 2987634 uno a uno (el primer nmero por el 2, el segundo por el 9 y as sucesivamente, cuando cada resultado supera un dgito, se toma slo la unidad). Ej.: C.I.: 1.234.567-X -> 2987634 -> 2, 8, 4, 8, 0, 8, 8 Se hace la sumatoria de los resultados, en el ejemplo sera 2+8+4+8+0+8+8=38 Se busca el primer nmero ms grande que 38 que termina en 0 y se le resta: 40-38= 2 (es lo mismo que 10-(38 mod 10)). Es x=2 pues, el dgito verificador para la cdula 1.234.567.

Otra manera ms simple de verlo es como un producto escalar de vectores en mdulo 10. Las primeras 7 cifras de la cdula pueden verse como un vector de largo 7. Ese vector es multiplicado escalarmente por el vector 8123476 obtenindose un nmero N. El dgito verificador resulta ser N mdulo 10. Ej.: C.I.: 1.234.567-X -> X = [(1x8)+(2x1)+(3x2)+(4x3)+(5x4)+(6x7)+(7x6)] mod 10 -> X = [8+2+6+12+20+42+42] mod 10 = 132 mod 10 = 2 Codigo clipper para el calculo del digito verificador *-------------------------------------------------------------------------------** * ?chkdig( 3139951 ) // resultado 5 * ** clear screen ced = 0 @5,5 get ced read ? chkdig( ced ) function Chkdig( nDocid ) local chd1 local t1,t2 local a1,a2,a3,a4,a5,a6,a7 local b1,b2,b3,b4,b5,b6,b7 a1 := int(nDocid/1000000) a2 := int(nDocid/100000)-(a1*10) a3 := int(nDocid/10000)-(a1*100+a2*10) a4 := int(nDocid/1000)-(a1*1000+a2*100+a3*10) a5 := int(nDocid/100)-(a1*10000+a2*1000+a3*100+a4*10) a6 := int(nDocid/10)-(a1*100000+a2*10000+a3*1000+a4*100+a5*10) a7 := int(nDocid/1)-(a1*1000000+a2*100000+a3*10000+a4*1000+a5*100+a6*10) b1 := mod(a1*2,10) b2 := mod(a2*9,10)

b3 := mod(a3*8,10) b4 := mod(a4*7,10) b5 := mod(a5*6,10) b6 := mod(a6*3,10) b7 := mod(a7*4,10) t1 := b1+b2+b3+b4+b5+b6+b7 t2 := mod(t1,10) chd1 := abs(t2-10) chd1 := mod(chd1,10) return int(chd1) *--------------------------------------------------------------------------------