-
-
Save gaulatti/69a24cc199a4253d058c to your computer and use it in GitHub Desktop.
<!doctype html> | |
<html lang="es"> | |
<head> | |
<meta charset="UTF-8"> | |
<title>Validador de RUT HTML5</title> | |
</head> | |
<body> | |
<form> | |
<input type="text" id="rut" name="rut" required oninput="checkRut(this)" placeholder="Ingrese RUT"> | |
<button type="submit">Validar RUT y Enviar Form</button> | |
<script src="validarRUT.js"></script> | |
</form> | |
</body> | |
</html> |
function checkRut(rut) { | |
// Despejar Puntos | |
var valor = rut.value.replace('.',''); | |
// Despejar Guión | |
valor = valor.replace('-',''); | |
// Aislar Cuerpo y Dígito Verificador | |
cuerpo = valor.slice(0,-1); | |
dv = valor.slice(-1).toUpperCase(); | |
// Formatear RUN | |
rut.value = cuerpo + '-'+ dv | |
// Si no cumple con el mínimo ej. (n.nnn.nnn) | |
if(cuerpo.length < 7) { rut.setCustomValidity("RUT Incompleto"); return false;} | |
// Calcular Dígito Verificador | |
suma = 0; | |
multiplo = 2; | |
// Para cada dígito del Cuerpo | |
for(i=1;i<=cuerpo.length;i++) { | |
// Obtener su Producto con el Múltiplo Correspondiente | |
index = multiplo * valor.charAt(cuerpo.length - i); | |
// Sumar al Contador General | |
suma = suma + index; | |
// Consolidar Múltiplo dentro del rango [2,7] | |
if(multiplo < 7) { multiplo = multiplo + 1; } else { multiplo = 2; } | |
} | |
// Calcular Dígito Verificador en base al Módulo 11 | |
dvEsperado = 11 - (suma % 11); | |
// Casos Especiales (0 y K) | |
dv = (dv == 'K')?10:dv; | |
dv = (dv == 0)?11:dv; | |
// Validar que el Cuerpo coincide con su Dígito Verificador | |
if(dvEsperado != dv) { rut.setCustomValidity("RUT Inválido"); return false; } | |
// Si todo sale bien, eliminar errores (decretar que es válido) | |
rut.setCustomValidity(''); | |
} |
valeria!
No me funciona en un jsp.
No me funciona en un jsp.
Está escrito en ES6, actualmente la mayoría de browsers los soportan. Se puede transpilar con babel a ES5 que ejectua con seguridad en cualquier navegador. Es javascript, en un JSP debe ir dentro de un tag <script>.
Muchas gracias, excelente script y muy adaptable.
Gracias buen señor, esta filete
Fuera línea de tiempo... pero podria utilizar la implementación que hizo SII, es 100% js
wena gracias me sirvio arto lo unico que le puse maxlength en el input por si las moscas
Fuera línea de tiempo... pero podria utilizar la implementación que hizo SII, es 100% js
donde se puede ver?
Hay que "cachurear" en los scripts asociado al input de ingreso del rut. Es antiguo, pero totalmente funcional y vigente.
Seria interesante que suban el código depurado, código final si errores y funcionando, con tantos cambios y sugerencias de mejoras al final es una ensalada de código y los que no somos muy expertos terminamos abandonando la pagina en busca de algo mas claro y funcional,, lo comento sin el animo de critica si no de una saludable sugerencia, se agradece el aporte.
naaa genio! muchas gracias, lo implemente para un login y creacion de nuevos usuarios, y funcionó a la primera, muchas gracias por tu aporte!
// Esto lo usan en sii
// para q reinventar la rueda a menos que sea para optimizar.
// El editor de github se fue a la cresta! no edita correctamente el fuente, sorry nada más que hacer...
// USD 7.5M compra de github y no pueden dejar un editor decente. Incomprensible....
function formatoRut(texto, inputText) {
objRut = document.getElementById(inputText);
var rut_aux = "";
for ( i=0; i < texto.length ; i++ )
if ( texto.charAt(i) != ' ' && texto.charAt(i) != '.' && texto.charAt(i) != '-' )
rut_aux = rut_aux + texto.charAt(i);
largo = rut_aux.length;
if(largo == 0) return false;
if (largo<2) return false;
for (i=0; i < largo ; i++ ) {
var letra = rut_aux.charAt(i);
if (!letra.match(/^([0-9]|[kK])$/)) return false;
}
var rut_inv = "";
for ( i=(largo-1),j=0; i>=0; i--,j++ ) rut_inv = rut_inv + rut_aux.charAt(i);
var dtexto = "";
dtexto = dtexto + rut_inv.charAt(0);
dtexto = dtexto + '-';
cnt = 0;
for ( i=1,j=2; i<largo; i++,j++ ){
if ( cnt == 3 ){
dtexto = dtexto + '.';
j++;
dtexto = dtexto + rut_inv.charAt(i);
cnt = 1;
} else {
dtexto = dtexto + rut_inv.charAt(i);
cnt++;
}
}
rut_inv = "";
for ( i=(dtexto.length-1),j=0; i>=0; i--,j++ ) rut_inv = rut_inv + dtexto.charAt(i);
objRut.value = rut_inv.toUpperCase()
}
function validaRut(texto, inputText) {
objRut = document.getElementById(inputText);
var rut_aux = "";
for ( i=0; i < texto.length ; i++ )
if ( texto.charAt(i) != ' ' && texto.charAt(i) != '.' && texto.charAt(i) != '-' )
rut_aux = rut_aux + texto.charAt(i);
largo = rut_aux.length;
if(largo == 0){
bootstrap_alert.warning('Por favor, ingrese rut y clave.');
return false;
}
if (largo<2){
bootstrap_alert.warning('Debe ingresar el rut completo');
objRut.focus();
objRut.select();
return false;
}
for (i=0; i < largo ; i++ ) {
var letra = rut_aux.charAt(i);
if (!letra.match(/^([0-9]|[kK])$/)){
bootstrap_alert.warning('El RUT ingresado no es valido');
objRut.focus();
objRut.select();
return false;
}
}
var rut_inv = "";
for ( i=(largo-1),j=0; i>=0; i--,j++ ) rut_inv = rut_inv + rut_aux.charAt(i);
var dtexto = "";
dtexto = dtexto + rut_inv.charAt(0);
dtexto = dtexto + '-';
cnt = 0;
for ( i=1,j=2; i<largo; i++,j++ ){
if ( cnt == 3 ){
dtexto = dtexto + '.';
j++;
dtexto = dtexto + rut_inv.charAt(i);
cnt = 1;
} else {
dtexto = dtexto + rut_inv.charAt(i);
cnt++;
}
}
rut_inv = "";
for ( i=(dtexto.length-1),j=0; i>=0; i--,j++ ) rut_inv = rut_inv + dtexto.charAt(i);
objRut.value = rut_inv.toUpperCase()
if ( validaDv(rut_aux, inputText) ) return true;
return false;
}
function validaDv( texto, inputText ) {
largo = texto.length;
if ( largo > 2 ){
rut_aux = texto.substring(0, largo - 1);
dv = texto.charAt(largo-1);
} else {
rut_aux = texto.charAt(0);
dv = texto.charAt(largo-1);
}
if (rut_aux.match(/k+/)){
bootstrap_alert.warning('El RUT ingresado no es valido');
document.getElementById(inputText).focus();
document.getElementById(inputText).select();
return false;
}
/elementos a variables/
document.getElementById("rut").value=rut_aux ;
document.getElementById("dv").value=dv;
if ( rut_aux == null || dv == null ) return 0;
var dvr = '0'
var suma = 0
var mult = 2
var res = 0
for (i= rut_aux.length-1 ; i >= 0; i--){
suma = suma + rut_aux.charAt(i) * mult
if (mult == 7)
mult = 2
else
mult++
}
res = suma % 11
if (res==1)
dvr = 'k'
else if (res==0)
dvr = '0'
else{
dvi = 11-res
dvr = dvi + ""
}
if (dvr != dv.toLowerCase()){
bootstrap_alert.warning('D\u00EDgito Verificador incorrecto');
document.getElementById(inputText).focus();
document.getElementById(inputText).select();
return false;
}
return true;
}
alguien de angular 10 que me ayude con este ? https://codesandbox.io/s/numpad-rut-54udb se debe dar el fomarto usando los botones
Hola Gracias por tu Ayuda.
No soy experto en esto solo aficionado, lo estoy implementando en ASP.Net y el rut me lo deja de la siguiente forma 2414385-54
Debería quedar así
24143855-4
.- Codigo Script
<script type="text/javascript">
function checkRut(rut) {
var valor = rut.value.replace('.', '');
valor = valor.replace('-', '');
cuerpo = valor.slice(0, -1);
dv = valor.slice(-1).toUpperCase();
rut.value = cuerpo + '-' + dv
}
</script>
.- HTML
<asp:TextBox ID="txt_login" runat="server" Width="150px" ClientIDMode="Static" onkeypress="return checkRut(this)"></asp:TextBox>
Por favor si me pueden ayudar.
Bueno código! gracias por compartir.... bueno, por si alguien más le sirve, para quitar los puntos y guion ocupe estas exp. regulares:
function checkRut(rut) {
//Despejar Puntos
var valor = rut.replace(/./g, '');
//Despejar Guión
valor = valor.replace(/-/g, '');
Muchas gracias por el código, me sirvió mucho!
como lo harían si les piden validar también los rut provisorios de extranjeros, los cuales comienzan de los 100 millones, no he podido encontrar la respuesta
Esta semana voy a refactorizar esto (lo hice hace milenios), qué ha cambiado desde ese entonces en la forma de validarlo aparte del módulo 11?
He visto bastantes módulos sobre todo de WooCommerce que tienen módulos validadores, no sé si son APIs o corren scripots
Segun esta guia, el calculo es bastante simple y aplica para numeros de rut "infinitamente" largos...
https://validarutchile.cl/calcular-digito-verificador.php
la de jumpseller lleva un ejemplo muy compacto (dificil de leer) en javascript
Hola,
Muy buena solución, la separe en dos, la moví a ES6, y saqué la conexión con el campo HTML.
Estos son los tests, ruts sacados de http://jqueryrut.sourceforge.net/generador-de-ruts-chilenos-validos.html