Iniciado por
Devian
Perdonen que retome éste tema antiguo, pero eso de la fórmula sigue actual.
Estuve buscando por las internetes esa misma fórmula pero hecha en excel, y no encontré nada, es raro, así que tuve que poner manos a la obra.
Me quedó un poco larga pero es así porque quería hacerla sin ninguna referencia absoluta a ninguna celda en especial.
Ésta formula agarra la celda de la izquierda y calcula el dígito verificador.
De esa forma pueden "copiar y pegar" la misma fórmula en cualquier celda de la tabla de excel, la fórmula no cambia independientemente del lugar donde esté.
Si usan el Excel en ESPAÑOL la fórmula es ésta:
=RESIDUO(ABS(RESIDUO(RESIDUO(RESIDUO(ENTERO(INDIRECTO("F"&FILA()&"C"&COLUMNA()-1;0)/10^6);10)*2;10)+RESIDUO(RESIDUO(ENTERO(INDIRECTO("F"&FILA()&"C"&COLUMNA()-1;0)/10^5);10)*9;10)+RESIDUO(RESIDUO(ENTERO(INDIRECTO("F"&FILA()&"C"&COLUMNA()-1;0)/10^4);10)*8;10)+RESIDUO(RESIDUO(ENTERO(INDIRECTO("F"&FILA()&"C"&COLUMNA()-1;0)/10^3);10)*7;10)+RESIDUO(RESIDUO(ENTERO(INDIRECTO("F"&FILA()&"C"&COLUMNA()-1;0)/10^2);10)*6;10)+RESIDUO(RESIDUO(ENTERO(INDIRECTO("F"&FILA()&"C"&COLUMNA()-1;0)/10^1);10)*3;10)+RESIDUO(RESIDUO(ENTERO(INDIRECTO("F"&FILA()&"C"&COLUMNA()-1;0)/10^0);10)*4;10);10)-10);10)
Por ejemplo: pongo el Nº de cédula en la celda "F5", y la Fórmula la pongo en la celda de la derecha, "G5".
Seguro que hay mil maneras de hacer la misma fórmula un poco más corta.
Si Tienen el excel en Inglés la fórmula es ésta otra:
=MOD(ABS(MOD(MOD(MOD(INT(INDIRECT("R"&ROW()&"C"&COLUMN()-1;0)/10^6);10)*2;10)+MOD(MOD(INT(INDIRECT("R"&ROW()&"C"&COLUMN()-1;0)/10^5);10)*9;10)+MOD(MOD(INT(INDIRECT("R"&ROW()&"C"&COLUMN()-1;0)/10^4);10)*8;10)+MOD(MOD(INT(INDIRECT("R"&ROW()&"C"&COLUMN()-1;0)/10^3);10)*7;10)+MOD(MOD(INT(INDIRECT("R"&ROW()&"C"&COLUMN()-1;0)/10^2);10)*6;10)+MOD(MOD(INT(INDIRECT("R"&ROW()&"C"&COLUMN()-1;0)/10^1);10)*3;10)+MOD(MOD(INT(INDIRECT("R"&ROW()&"C"&COLUMN()-1;0)/10^0);10)*4;10);10)-10);10)
Devian
se los paso en java ya que estamos jaja
Código:
package estructuraDatos;
import java.util.ArrayList;
import java.util.Scanner;
import java.util.Iterator;
import java.util.List;
public class PrincipalRegex {
public static void main(String[] args) {
List<Integer> listaDigitos = new ArrayList<Integer>();
List<Integer> listaConstante = new ArrayList<Integer>();
;
listaConstante.add(8);
listaConstante.add(1);
listaConstante.add(2);
listaConstante.add(3);
listaConstante.add(4);
listaConstante.add(7);
listaConstante.add(6);
String ci = " ";
System.out.println("Ingrese su CI sin puntos y con guion por favor");
ci = ci.toString();
System.out.println(ci);
Scanner teclado = new Scanner(System.in);
ci = teclado.nextLine();
teclado.close();
int digitoVerif;
try {
if (ci.matches("([0-9]){7}[-.]{1}[0-9]{1}")) {
for (int i = 0; i < 7; i++) {
String dato = ci.substring(i, i + 1);
listaDigitos.add(Integer.parseInt(dato));
}
int resultado = ValidarDocumento(listaConstante, listaDigitos);
digitoVerif = Integer.parseInt(ci.substring(8));
System.out.println(ci.substring(8));
if (resultado == digitoVerif) {
System.out.println("Digito verificador valido");
} else {
System.out.println("Digito verificador no valido");
}
} else {
System.out.println("formato invalido, por favor use 9999999-9 o 9999999.9");
}
} catch (Exception e) {
System.out.println("La cedula contiene caracteres invalidos");
}
}
public static int ValidarDocumento(List<Integer> listaConstante, List<Integer> lista) {
// X = [(1x8)+(2x1)+(3x2)+(4x3)+(5x4)+(6x7)+(7x6)] mod 10
int guion = 0;
Iterator<Integer> constIterator = listaConstante.iterator();
Iterator<Integer> cedulaIterator = lista.iterator();
while (constIterator.hasNext()) {
guion += constIterator.next() * cedulaIterator.next();
}
// Aplico el modulo de 10 al resultado
guion = guion % 10;
return guion;
}
}
Si todos sabemos que se puede hacer mejor...