none
Validar Rut Chile desde un TextBox

    Question

  • 1ro que todo Buenas tardes, tambien quisiera disculparme por que se que este tema ya se ha visto un par de veces, pero no he podido dar con la solucion correcta o bien los que dicen lo solucionaron no compartieron su solucion.

    este semestre me ha tocado aprender C# con Visual Studio y por ahi quise hacer la validacion de un Rut(Rol Unico Tributario) de este mismo vinculo de la Wikipedia tome el codigo para C# y lo puse en un formulario en el evento Leave del TextBox entonces solo tengo:

    1 formulario Form1.cs

    2 textbox txtRut y txtOtro

    respectivamente

    Form1

    bueno ahora el codigo + el que tome de la Wiki

    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;
    
    namespace WindowsFormsApplication1
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
            
            private String digitoVerificador(int rut)
            {
                int Digito;
                int Contador;
                int Multiplo;
                int Acumulador;
                String RutDigito;
    
                Contador = 2;
                Acumulador = 0;
    
                while (rut != 0)
                {
                    Multiplo = (rut % 10) * Contador;
                    Acumulador = Acumulador + Multiplo;
                    rut = rut / 10;
                    Contador = Contador + 1;
                    if (Contador == 8)
                    {
                        Contador = 2;
                    }
                }
    
                Digito = 11 - (Acumulador % 11);
                RutDigito = Digito.ToString().Trim();
                if (Digito == 10)
                {
                    RutDigito = "K";
                }
                if (Digito == 11)
                {
                    RutDigito = "0";
                }
                return (RutDigito);
            }
    
            private void txtRut_Leave(object sender, EventArgs e)
            {
                if (this.txtRut.Text != "" || this.txtRut.Text.Length >= 7)
                {
                    //evaluar el valor ingresado
                    //Error 1 Ninguna sobrecarga para el método 'digitoVerificador' toma '0' argumentos.	
                    this.digitoVerificador();
    
                }
                else
                {
                    MessageBox.Show("Faltan Datos", "Mensaje de Alumnito",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }
        }
    }

    como ven tengo un error al llamar al metodo  this.digitoVerificador();

    Error 1 Ninguna sobrecarga para el método 'digitoVerificador' toma '0' argumentos.  

     la idea es que al ingresar el valor 123456785 o 12345674 o 8278697k  (todos estos son validos segun el modulo 11 del calculo digito verificador Chileno)al salir del txtRut me devuelve el mensaje error solo si el rut esta malo de otra manera que pase a la siguiente caja de texto eso si formateando el valor que el usuario digito a 12.345.678-5 o  1.2345674 o 8.278.697-k

    encontre este otro codigo para llamar al meotodo

     private void txtRut_Leave(object sender, EventArgs e)
            {
                if (this.txtRut.Text != "" || this.txtRut.Text.Length >= 7)
                {
                    if (digitoVerificador(Convert.ToInt32(txtRut.Text.Substring
                        (0, txtRut.Text.Length - 3)))
                        == txtRut.Text.Substring(txtRut.Text.LastIndexOf("-"), 1))
                    {
                        //EL RUT ES VALIDO
                    }
                    else
                    {
                        MessageBox.Show("Rut malo", "Mensaje de Alumnito",
                            MessageBoxButtons.OK, MessageBoxIcon.Error);
                        //EL RUT ES INVALIDO
                    }
                }
                else
                {
                    MessageBox.Show("Faltan Datos", "Mensaje de Alumnito",
                        MessageBoxButtons.OK, MessageBoxIcon.Error);
                }
            }

    lo malo es que siempre obtengo el mensaje error aunque el valor que ingreso sea valido. claro que debo ingresar los datos en este formato

    12345678-5 o  1234567-4 o 8278697-k y prefiero que el usuario no ingrese el guion. y si lo hago siempre obtengo el mensaje de error.

    espero haber podido explicarme bien.

    como dato anexo les digo que este valor se va a la base de datos solo hasta el valor anterior al guion "-" para poder guardarlo como int.

    salu2. 

    mis disculpas, es mi primera pregunta y esta bastante extensa.

    Tuesday, May 15, 2012 8:24 PM

Answers

  • bueno creo que publicare mi solucion, para cerrar este tema y que alguien mas tenga una respuesta. para que la pueda aplicar. si bien no valida la entrada no logre hacerlo en el evento keypress le da el formato al rut al salir de la caja con el evento Leave. es una clase publica "Rut" la cual tiene el metodo formatear el cual pueden llamar desde cualquier formulario.

    public class Rut
        {
            public String formatear(String rut)
            {
                int cont = 0;
                String format;
                if (rut.Length == 0)
                {
                    return "";
                }
                else
                {
                    rut = rut.Replace(".", "");
                    rut = rut.Replace("-", "");
                    format = "-" + rut.Substring(rut.Length - 1);
                    for (int i = rut.Length - 2; i >= 0; i--)
                    {
                        
                        format = rut.Substring(i, 1) + format; 
                          
                        cont++;
                        if (cont == 3 && i != 0)
                        {
                            format = "." + format;
                            cont = 0;
                        }
                    }
                    return format;
                }
            }
        }

    yo lo llame así.

    private void tbRut_Leave(object sender, EventArgs e) { Rut auxR = new Rut(); this.tbRut.Text = auxR.formatear(this.tbRut.Text); }

    es un formulario(el mismo que esta en el inicio del post) con un textBox que ahora se llama tbRut el otro textBox no se usa es solo para poder presionar el tabulador y gatillar el evento leave.

    salu2 espero a alguien mas le sirva


    Xdcfan

    • Marked as answer by Xdcfan Saturday, May 26, 2012 5:41 PM
    Saturday, May 26, 2012 5:41 PM

All replies

  • una pregunta similar se realizo en el foro

    http://social.msdn.microsoft.com/Forums/es-ES/vbes/thread/8ce9bb08-9ea2-4d13-a400-a120bfac49c3

    valida si la respuesta que alli se brinda no es de ayuda

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    Tuesday, May 15, 2012 8:41 PM
  • Gracias Leandro, lo vi, pero ese codigo esta en VB.net, y no tengo experiencia en tal lenguaje, al intentar usar herramientas de conversion de lenguaje online no pude dar con el codigo correcto por ciertos errores que no pude corregir.

    ;)


    Xdcfan

    Tuesday, May 15, 2012 8:54 PM
  • Hola Xdcfan!

    El código abajo, funcionó a la perfección en mis pruebas:

    using System.Text.RegularExpressions;

     public Form1()
            {
                InitializeComponent();
    
                string input = TextBox1.Text;
    
                Regex re = new Regex("^(\\d{2}\\.\\d{3}\\.\\d{3}-)([a-zA-Z]{1}$|\\d{1}$)");
    
                Match m = re.Match(input);
    
                if (m.Captures.Count == 0)
                {
                    MessageBox.Show("Message here");
                }
    
                
            }

    Probar y publicar los errores si no lo hace.


    Eder Costa
    LATAM Forum Support Engineer
    Microsoft Corporation
    forumguys

    Thursday, May 17, 2012 2:08 PM
    Owner
  • bueno creo que publicare mi solucion, para cerrar este tema y que alguien mas tenga una respuesta. para que la pueda aplicar. si bien no valida la entrada no logre hacerlo en el evento keypress le da el formato al rut al salir de la caja con el evento Leave. es una clase publica "Rut" la cual tiene el metodo formatear el cual pueden llamar desde cualquier formulario.

    public class Rut
        {
            public String formatear(String rut)
            {
                int cont = 0;
                String format;
                if (rut.Length == 0)
                {
                    return "";
                }
                else
                {
                    rut = rut.Replace(".", "");
                    rut = rut.Replace("-", "");
                    format = "-" + rut.Substring(rut.Length - 1);
                    for (int i = rut.Length - 2; i >= 0; i--)
                    {
                        
                        format = rut.Substring(i, 1) + format; 
                          
                        cont++;
                        if (cont == 3 && i != 0)
                        {
                            format = "." + format;
                            cont = 0;
                        }
                    }
                    return format;
                }
            }
        }

    yo lo llame así.

    private void tbRut_Leave(object sender, EventArgs e) { Rut auxR = new Rut(); this.tbRut.Text = auxR.formatear(this.tbRut.Text); }

    es un formulario(el mismo que esta en el inicio del post) con un textBox que ahora se llama tbRut el otro textBox no se usa es solo para poder presionar el tabulador y gatillar el evento leave.

    salu2 espero a alguien mas le sirva


    Xdcfan

    • Marked as answer by Xdcfan Saturday, May 26, 2012 5:41 PM
    Saturday, May 26, 2012 5:41 PM
  • Fantástico, tremendo aporte gracias!!
    Friday, August 02, 2013 5:18 PM