validación de rut en java

May 17, 2010 12 Comments by

El RUT (Rol Único Tributario) es el identificador de personas (naturales o jurídicas) en Chile, consiste en un número natural más un dígito verificador. Ejemplo 1-9.

El dígito verificador, se puede verificar o calcular a través de una variante del algoritmo de código de control Módulo 11, ¿Por qué es una variante? Tiene una pequeña variante respecto al original, cuando el resto es 11, el dígito verificador es 0, si es 10 es K y el resto se mantiene (más información sobre el algoritmo).

Implementación en Java

Hay muchas formas de implementar el algoritmo, pero una que me sorprendio, por su sencillez y pocas líneas, es el método verificarRut de creations.cl (http://www.creations.cl/2009/01/generador-de-rut-y-validador/)

El siguiente ejemplo, crea una pequeña ventana, a ella le añade tres elementos, un JLabel, JTextfield y un JButton finalmente capturamos el evento del botón para verificar si el rut ingresado es correcto.

package org.deerme.examples;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

/**
 * This is an example RUT validation
 * @author deerme.org
 */
public class ValidarRut   extends JFrame implements ActionListener {

    private JButton btnValidar;
    private JTextField txtRut;
    private JLabel labRut;

    public ValidarRut()
    {
        super ( "Ejemplo de Validación de RUT" );
        this.setSize(300, 300);
        this.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);        

        // Agregamos elementos a la ventana
        this.setLayout( new FlowLayout(FlowLayout.LEFT, 20, 10)  );

        labRut = new JLabel("Rut");
        txtRut = new JTextField(20);
        txtRut.setText("16327531-7");
        btnValidar = new JButton("Validar");
        btnValidar.addActionListener(this);
        this.add(labRut);
        this.add(txtRut);
        this.add(btnValidar);

        this.setVisible(true);

    }

    public static void main(String[] args) {
        // TODO code application logic here
        new ValidarRut();
    }

    public void actionPerformed(ActionEvent e) {

        // Validamos el RUt
        if (e.getSource()==btnValidar)
        {
            if ( txtRut.getText().length() > 0  )
            {
                // Creamos un arreglo con el rut y el digito verificador
                String[] rut_dv = txtRut.getText().split("-");
                // Las partes del rut (numero y dv) deben tener una longitud positiva
                if ( rut_dv.length == 2   )
                {
                    // Capturamos error (al convertir un string a entero)
                    try
                    {
                        int rut = Integer.parseInt( rut_dv[0] );
                        char dv = rut_dv[1].charAt(0);

                        // Validamos que sea un rut valido según la norma
                        if ( this.ValidarRut(rut, dv)  )
                        {
                            JOptionPane.showMessageDialog(rootPane, "Rut correcto");
                        }
                        else
                        {
                            JOptionPane.showMessageDialog(rootPane, "Rut incorrecto");
                        }
                    }
                    catch( Exception ex )
                    {
                        System.out.println(" Error " + ex.getMessage());
                    }
                }
            }
        }
    }

    /*
     * Método Estático que valida si un rut es válido
     * Fuente : http://www.creations.cl/2009/01/generador-de-rut-y-validador/
     */
    public static 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 dv == (char) (s != 0 ? s + 47 : 75);
    }

}

Java

About the author

Ingeniero en Informática, Oracle Certified Master Java EE 6 Enterprise Architect, Oracle Certified Professional Java Programmer. Experto en distintas ramas de la computación y otras "yerbas" xD. Si te gusto este post, sígueme en @deerme_org, escríbeme a info AT deerme.org o contactame por linkedin.

12 Responses to “validación de rut en java”

  1. Armando Vargas says:

    Saludos:
    Está muy bueno el código, pero necesito saber cómo puedo hacer una clase la cual pueda ser llamada desde un botón en otra ventana independiente de la clase de validación de RUT. La idea es que pueda llamar a la clase desde más de un botón en distintas ventanas donde sea requerido.
    Muchas gracias.

  2. deerme.org says:

    Armando

    Si el método lo defines como estático, lo puedes llamar sin tener una instancia de el. Siempre y cuando la clase que contenga al método, este dentro del mismo package de tu proyecto o importes el package.

    En el ejemplo, el método ValidarRut de la clase ValidarRut es estático, por lo tanto, lo puedes llamar desde cualquier otro punto sin tener una instancia de la clase, por ejemplo ValidarRut.ValidarRut(12345678,’k')

    Saludos

  3. Armando Vargas says:

    Gracias por la respuesta. La duda que me queda cómo llamo a la clase en el botón, es decir, cómo es el código en el evento del JButton.
    Otra cosa importante es que el RUT es ingresado en un JTextField dentro de un JFrame o JInternalFrame, una vez que se pasa a escribir en el JTextField siguiente, nos indique si el RUT o RUN ingresado es correcto.
    Gracias desde ya y pido disculpas por preguntar tanto…
    *** Creo que no existen preguntas tontas, sino tontos que no preguntan. ***

  4. deerme.org says:

    Armando

    Lo puedes hacer de muchas formas, creo que lo más sencillo es capturar el string del JTextField, capturar los parámetros (rut más digito verificador) y entregar estos valores al método validador de rut. Todo eso en el evento que va a validar el rut (en un boton, al perder el focus del textfield, etc …), el código sería muy similar al del ejemplo:

    /* En algún evento ... */
    
    // txtRut es un JTextField, primero capturamos el string y realizamos un split sobre el (para capturar el rut más el digito verificador)
    String[] rut_dv = txtRut.getText().split("-");
    // Luego convertimos el rut en un entero y el digito verificador en un carácter
    int rut = Integer.parseInt( rut_dv[0] );
    char dv = rut_dv[1].charAt(0);
    
    // Ahora solo nos queda llamar el método público y estático ValidarRut, suponiendo que el está definido en la clase Libreria
    if ( Libreria.ValidarRut(rut, dv)  )
    {
    	JOptionPane.showMessageDialog(rootPane, "Rut correcto");
    }
    else
    {
    	JOptionPane.showMessageDialog(rootPane, "Rut incorrecto");
    }
    
  5. Victor says:

    Hola amigo probe tu codigo y si funciona perfecto quisiera saber como le hago para que me valide cuando el RUT contenga ademas del guion los puntos:
    11111111-1 —> 11.111.111-1
    como puedo validar de ambas formas’??

  6. deerme.org says:

    Victor, hay varias formas, creo que lo más correcto sería utilizar una expresión regular, para detectar si el string contenido en el input, primero válida a un rut con puntos.

    Sin embargo, podemos saltarnos la validación con expresiones regulares y simplemente reemplazar los puntos por un vacío, de esa manera si el usuario ha ingresado el rut 11.111.111-1, vamos a operar con el string 11111111-1, en fines prácticos es más sencillo.

    Solo deberías modificar la línea

    String[] rut_dv = txtRut.getText().split("-");

    por

    String[] rut_dv = txtRut.getText().replace(".","").split("-");

    Debería funcionar.

    Saludos

  7. Anonymous says:

    [...] el digito verificador… eso nomas recuerdo :v Validador rut java en google, primer resultado: validaci ? [...]

  8. QualityInfoSolution says:

    http://www.qualityinfosolutions.com/validador-de-rut-chileno-en-java/

    Podrán encontrar la solución al problema de validar un rut en java además pueden dejar sus dudas y estaremos encantados en poder ayudarlos.

    Saludos

  9. javier says:

    No puedo arrancar en Netbeans, como lo hago, gracias por la ayuda

  10. deerme.org says:

    Javier, no das muchos datos como para averiguar donde esta el problema, creo que primero verifica que tengas instalados el sdk y tu instalación de netbeans sepa donde esta el sdk. O instala la última versión de netbeans con el sdk incluido.

    Luego crea un nuevo proyecto y agrega el código.

    Cuentame si te aparece algún warning o error

    Saludos

  11. QualityInfoSolutions says:

    Javier debes buscar un archivo llamado .netbeans y renombrarlo. Es el error mas frecuente por el cual no abre netbeans y se debe a una mala configuración.

  12. Esteban says:

    como puedo crear un validador sin entrar a lo de java grafico, ahora estuve haciendo una captura de varios datos, el codigo del validador es public boolean validarRut(String rut) {

    boolean validacion = false;
    try {

    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;
    System.out.println(“su rut es valido”);
    }
    else{
    System.out.print(“su rut es invalido”);
    }

    } catch (java.lang.NumberFormatException e) {
    } catch (Exception e) {
    }
    return validacion;
    }
    }
    pero mi problema es que no distingue el -K alguna solución? ¡, trabajo con netbeans.de antemano gracias.

Leave a Reply


one * 5 =