Validation of rout in java

2

This is the exercise: Create a Program that allows you to enter a person's Rut and show:

If the Rut is valid or not, if it is not valid, allow it to be re-entered, you only have 3 chances to make a mistake, after 3 times the program ends with a blocking message, if it is valid, show message.

Enter the Rut without the verifier and the program must calculate and display the corresponding verifier. The program must allow the entry of as many Rut as necessary.

And so I did:

(This is the class):

public class ValidacionRut {
    private int rut;
    private String rutDigito;
    private int Digito;
    private int Multiplo;
    private int Acumulador;

public ValidacionRut(String rutDigito, int Digito, int Multiplo, int Acumulador, int rut) {
    this.rutDigito = rutDigito;
    this.Digito = Digito;
    this.Multiplo = Multiplo;
    this.Acumulador = Acumulador;
}

public ValidacionRut() {
}

public String getRutDigito() {
    return rutDigito;
}

public void setRutDigito(String rutDigito) {
    this.rutDigito = rutDigito;
}

public int getDigito() {
    return Digito;
}

public void setDigito(int Digito) {
    this.Digito = Digito;
}

public int getMultiplo() {
    return Multiplo;
}

public void setMultiplo(int Multiplo) {
    this.Multiplo = Multiplo;
}

public int getAcumulador() {
    return Acumulador;
}

public void setAcumulador(int Acumulador) {
    this.Acumulador = Acumulador;
}
public int getRut() {
    return rut;
}

public void setRut(int rut){
    this.rut=rut;
}
public void ValidarRut(){
    int contador;
    contador=2;
    Acumulador=0;
    while (rut!=0){
        Multiplo=(rut%10)*contador;
        Acumulador=Acumulador+Multiplo;
        rut=rut/10;
        contador=contador++;
        if(contador==8){
            contador=2;
        }
    }

}

}

(This is the main): public class Exercise_RUT {

public static void main(String[] args) {
   ValidacionRut Leer=new ValidacionRut();

   int rut;
   String rutDigito = null;
   int Digito = 0;
   int Multiplo;
   int Acumulador;
   rut=Integer.parseInt(JOptionPane.showInputDialog("Ingresar el RUT de la persona"));
   JOptionPane.showMessageDialog(null, "El rut ingresado es: "+rut);
   ValidacionRut rutPersona= new ValidacionRut();
    rutPersona.ValidarRut();

   if(Digito==10){
       rutDigito="K";
       JOptionPane.showMessageDialog(null, "El rut es valido");
   }
   if(Digito==11){
       rutDigito="0";
       JOptionPane.showMessageDialog(null, "El rut es valido");
   }
   if(Digito>10 && Digito>11){
       JOptionPane.showMessageDialog(null, "Rut totalmente invalido");
   }




}

}

But it does not take me from the first if down, I do not know what I'll be failing: (

    
asked by nicolasyo1WWE 17.11.2017 в 01:23
source

3 answers

1

To validate the RUT you can use the following method.

public static boolean validarRut(String rut) {

    boolean validacion = false;
    try {
        rut =  rut.toUpperCase();
        rut = rut.replace(".", "");
        rut = rut.replace("-", "");
        int rutAux = Integer.parseInt(rut.substring(0, rut.length() - 1));

        char dv = rut.charAt(rut.length() - 1);

        int m = 0, s = 1;
        for (; rutAux != 0; rutAux /= 10) {
            s = (s + rutAux % 10 * (9 - m++ % 6)) % 11;
        }
        if (dv == (char) (s != 0 ? s + 47 : 75)) {
            validacion = true;
        }

    } catch (java.lang.NumberFormatException e) {
    } catch (Exception e) {
    }
    return validacion;
}
    
answered by 17.04.2018 в 06:06
1

Some additional considerations, Validate input that is not Null.

private boolean isValidRut(String rut)
{
    boolean ret = false;
    if(rut != null && rut.trim().length() > 0)
    {
        try {
            rut = rut.replaceAll("[.]", "").replaceAll("-", "").trim().toUpperCase();
            char dv = rut.charAt(rut.length() - 1);
            String mantisa = rut.substring(0, rut.length() - 1);
            if( isInteger( mantisa ) )
            {
                int mantisaInt = Integer.parseInt( mantisa );
                ret = validarRut( mantisaInt, dv ) ;
            }
        }
        catch (Throwable e) 
        {
            error("[isValidRut] ["+rut+"]", e);
        }
    }
    return ret;
}

private boolean validarRut(int rut, char dv)
{
    int m = 0, s = 1;
    for (; rut != 0; rut /= 10)
    {
        s = (s + rut % 10 * (9 - m++ % 6)) % 11;

    }
    return Character.toUpperCase(dv) == (char) (s != 0 ? s + 47 : 75) ;
}

public boolean isInteger(String cad)
{
    for(int i = 0; i<cad.length(); i++){
        if( !Character.isDigit(cad.charAt(i)) )
        {
            return false;
        }
    }
    return true;

}
    
answered by 24.09.2018 в 15:30
0

You are close to the solution, your algorithm for calculating the check digit is correct.

I hope this example clarifies your doubts and you can implement it in your program.

public class Test {
    public static void main(String[] args) {
        // prueba de rut con dígito equivocado:
        int rut = 30686957;

        Boolean valido;
        int verificador;

        verificador = 1;
        valido = validarRut(rut, verificador);
        System.out.printf("El dígito verificador %d para el rut %d es: %s\n", verificador, rut, valido ? "válido" : "inválido");

        // prueba de rut con dígito correcto:
        verificador = 4;
        valido = validarRut(rut, verificador);
        System.out.printf("El dígito verificador %d para el rut %d es: %s\n", verificador, rut, valido ? "válido" : "inválido");
    }

    public static Boolean validarRut(final int rutSinVerificador, final int digitoVerificador) {
        int rut = rutSinVerificador; //rut sin dígito verificador.
        int contador = 2;
        int acumulador = 0;
        while (rut != 0) {
            int multiplo = (rut % 10) * contador;
            acumulador = acumulador + multiplo;
            rut = rut / 10;
            contador++;
            if (contador == 8) {
                contador = 2;
            }
        }
        int digitoCorrecto = acumulador % 10;
//        System.out.printf("El dígito verificador es: %d\n", digitoCorrecto);
        return digitoCorrecto == digitoVerificador;
    }
}
    
answered by 17.11.2017 в 17:45