validador-digito-verificador-chile
Version:
Librería que valida si el rut ingresado es valido, calcula el digito verificador, limpia y formatea run
123 lines (119 loc) • 3.27 kB
JavaScript
/**
* Valida el Digito Verificador del RUN ingresado
* @param {string} run - Ingresa el run
* @returns {boolean} Devuelve true cuando es un rut valido, false cuando es invalido y null cuando ocurre un error
*/
function Validar(run) {
try {
let rut = Limpiar(run);
let resultado = CalcularDV(rut.numero);
if (resultado === rut.dv) {
return true;
} else {
return false;
}
} catch (error) {
console.error("Ocurrio un error al tratar de validar");
return null;
}
}
/**
* Calcula el Digito verificador de un RUN
* @param {string} numero - Ingresa el run sin digito verificador
* @returns {boolean} Devuelve el digito verificador como string y cuando ocurre un error devuelve null
*/
function ObtenerDV(numero) {
try {
if (numero.includes("-")) throw new Error("No debe incluir DV");
let num = Limpiar(numero, false).numero;
let dv = CalcularDV(num);
// console.log(dv);
return dv;
} catch (error) {
console.log(error);
return null;
}
}
/**
* Limpia un RUN
* @param {string} run - Ingresa el run
* @returns {object} Devuelve un objeto con el numero y dv
*/
function Limpiar(run) {
try {
let runLimpio = run.replaceAll(/[^0-9]/g, "");
let numero = null;
let dv = null;
if (run.includes("-")) {
numero = runLimpio.slice(0, runLimpio.length - 1);
dv = runLimpio.slice(runLimpio.length - 1, runLimpio.length);
} else {
numero = runLimpio.slice(0, runLimpio.length);
dv = null;
}
return { numero: numero, dv: dv };
} catch (error) {
console.log("Ocurrio un error al limpiar RUN");
}
}
/**
* Limpia un RUN
* @param {string} run - Ingresa el run con digito verificador
* @param {boolean} puntos - Si es true agrega . al run final, por defecto es false
* @returns {string} Devuelve un string con formato 11111111-1 y si puntos es true devuelve 11.111.111-1
*/
function DarFormato(run, puntos = false) {
try {
let resultado = "";
let runLimpio = run.replaceAll(/[^0-9]/g, "");
let offset = 0;
runLimpio.length == 8 ? (offset = 1) : (offset = 0);
for (let i = 0; i < runLimpio.length; i++) {
resultado += runLimpio[i];
if ((i == 1 - offset || i == 4 - offset) && puntos) {
resultado += ".";
}
if (i == 7 - offset) {
resultado += "-";
}
}
// console.log(resultado);
return resultado;
} catch (error) {
console.log("Ocurrio un error al dar formato a RUN");
}
}
function CalcularDV(numero) {
try {
let multiplicador = 2;
let suma = 0;
for (let i = numero.length - 1; i >= 0; i--) {
suma += numero[i] * multiplicador;
if (multiplicador == 7) {
multiplicador = 2;
} else {
multiplicador++;
}
}
let modulo = 11 - (suma % 11);
let dv = "";
dv = String(modulo);
if (modulo === 11) {
dv = "0";
}
if (modulo == 10) {
dv = "k";
}
return dv;
} catch {
console.error("Ocurrio un error al tratar de calcular el DV");
return null;
}
}
const dv = {
DarFormato,
Limpiar,
Validar,
ObtenerDV,
};
export default dv;