How to format Chilean Rut with points and script when entering it in the input

4

When entering a routine it is validated, but I would like to format it so that when it is entered it will be in the format 1.234.567-8 or 12.345.678-9

I have tried this way:

function validaRut(rut){ 
  var suma=0; 
  var arrRut = rut.split("-"); 
  var rutSolo = arrRut[0]; 
  var verif = arrRut[1]; 
  var continuar = true; 
  for(i=2;continuar;i++){ 
    suma += (rutSolo%10)*i; 
    rutSolo = parseInt((rutSolo /10)); 
    i=(i==7)?1:i; 
    continuar = (rutSolo == 0)?false:true; 
  }
   resto = suma%11; dv = 11-resto; 
   if(dv==10){  
      if(verif.toUpperCase() == 'K') return true;
   }else if (dv == 11 && verif == 0)
    return true; 
    else if (dv == verif) return true; 
    else alert("RUT incorrecto, ingréselo en el formato 11111111-1");
    return false;
 
}
    
asked by Marcela Faúndez 03.07.2017 в 15:20
source

2 answers

3

an example of validation of Rut applying the calculation formula of the Chilean check digit,

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('');
}
    <form>
        <input type="text" id="rut" name="rut" required oninput="checkRut(this)" placeholder="Ingrese RUT">
        <button type="submit">Validar RUT y Enviar Form</button>
    </form>
As you can see it will always be validated when writing in the input but it can be according to your needs

merit to link

    
answered by 03.07.2017 в 15:53
2

I recommend you use Inputmask You create a mask for Js, where you force the user to write in the format you want.

$("#test").inputmask({
	mask: "9[9.999.99]-[9|K|k]",
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.3.4/inputmask/inputmask.js"></script>
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.3.4/jquery.inputmask.bundle.js"></script>
<link href="https://cdnjs.cloudflare.com/ajax/libs/jquery.inputmask/3.3.4/css/inputmask.min.css" rel="stylesheet"/>


<html>
<input type="text " id="test">
</html>
    
answered by 21.03.2018 в 16:43