none
validaciones de rut y caja de textbox RRS feed

  • Pregunta

  • Estimados:

    necesito su ayuda o consejo para solucionar el tema de la validación del rut chileno, he tenido varias validaciones tanto como que me da el dv automáticamente o digitar el dv en el textbox.(esto lo hago todo en un textbox).-

    muy bien el tema es el siguiente:

    teniendo la caja de textbox, valida los rut, tanto con los 8 primeros dígitos y su dv, o con los 7 primeros dígitos con su dv.

    bien, mi problema, y me pongo en el lado del usuario es validar o limitar el ingreso de datos a esta caja, aplico que en la caja de texto solo me valide la digitacion de numero del 0-9 la k minúscula y la K mayúscula y una cantidad de 10 caracteres como maximo(maxlength)

    había pensado reemplazar el textbox por un maskedtextbox y darle la siguiente mascara 00000000-0, el cual me deja que valide ingresar solo numero.

    pero con todo esto por ejemplo puedo digitar esto y se me caerá el programa:

    ejemplo:

    dentro del textbox -------- se cae el programa
    1
    ----9 se cae el programa
    16136476- se cae el programa etc
    16136-475- se cae el programa

    y así una seguidilla de combinaciones que estén dentro de estos caracteres y que no cumplen con el modelo del rut, se va a caer, me entienden?

    que tendría que mejorar, mi código de validación del rut, la caja de textboc o maskedtexbox?
    y existe la posibilidad de que en maskedtextbox al dejarlo con la mascara 00000000-0 el cual se muestra ________-_
    al ingresar un rut con 8 dígitos ejem 16136476-2  cumple con la condición  y valida el rut, pero al ingresar un rut de 7 digitos ejemplo 5849756-8 me quedaria asi: 5849756_-8.

    como hago que al ingresar ese rut automáticamente se mueva despues del guion? y quedara 5849756-8

    dejo mi código de validación de rut

    Module validarut2
    
        Public Function valida_rut(ByVal ci As String) As Boolean
            Dim cont, i, sum As Integer
            Dim car, digito, dig, rut As String
            Dim largo As Integer
            largo = Len(ci)
            cont = 2
            rut = Mid(ci, 1, largo - 2)
            digito = Mid(ci, largo, 1)
    
            For i = Len(rut) To 1 Step -1
                car = Mid(rut, i, 1)
                sum = sum + CInt(car) * cont
                cont = cont + 1
                If cont = 8 Then
                    cont = 2
                End If
            Next
            dig = 11 - (sum Mod 11)
            If dig = 10 And UCase(digito) = "K" Then
                valida_rut = True
            ElseIf dig = 11 And digito = 0 Then
                valida_rut = True
            ElseIf CStr(dig) = digito Then
                valida_rut = True
            Else
                valida_rut = False
            End If
        End Function
    
    End Module

    Y Como llamo a la validacion con un buton:

    rivate Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnbuscar.Click
            Dim veri As Boolean
            If txtrut.Text <> "" Then
                veri = valida_rut(txtrut.Text)
                If veri = False Then
                    MsgBox("Ingrese rut valido")
                    txtrut.Text = ""
                ElseIf veri = True Then
                    Dim consulta sql.....................

    bueno espero que me comprendan y me puedan ayudar a como solucionar esto.-

    atte

    Esteban

    • Cambiado Enrique M. Montejo jueves, 13 de noviembre de 2014 15:45 Pregunta relacionada con controles de Windows Forms.
    jueves, 25 de julio de 2013 16:21

Todas las respuestas

  • Hola Esteban,

    Usa este código

    Public Class Form1
        Public Function obtenerRut(cadena As String) As String
            Dim cadena1 As String
            Dim L As Integer
            L = cadena.Length
            Dim RUT(L) As String
            For i As Integer = 0 To L - 1 Step 1
                RUT(i) = cadena.Substring(i, 1)
            Next
            For j As Integer = L - 1 To 0 Step -1
                If j = L - 1 Then
                    cadena1 = "-" & RUT(j)
                ElseIf j < L - 1 And j > L - 4 Then
                    cadena1 = RUT(j) & cadena1
                ElseIf j = L - 4 Then
                    cadena1 = "." & RUT(j) & cadena1
                ElseIf j < L - 3 And j > L - 7 Then
                    cadena1 = RUT(j) & cadena1
                ElseIf j = L - 7 Then
                    cadena1 = "." & RUT(j) & cadena1
                Else
                    cadena1 = RUT(j) & cadena1
                End If
            Next
            Return cadena1
        End Function

        Public Function validarRun(cadena As String) As Boolean
            Dim validar As Boolean
            Dim L As Integer = cadena.Length
            Dim Rut(L) As String
            Dim Suma As Integer = 0
            Dim Resto As Integer
            Dim Rf As String
            Dim Dv As String
            For i As Integer = (L - 1) To 0 Step -1
                Rut(i) = cadena.Substring(i, 1)
            Next
            For i As Integer = 1 To (L - 1) Step 1
                If i <= 6 Then
                    Suma = (i + 1) * Rut(L - 1 - i) + Suma
                Else
                    Suma = (i - 5) * Rut(L - 1 - i) + Suma
                End If
            Next
            Resto = Suma Mod 11
            Rf = 11 - Resto
            If Rf = 11 Then
                Dv = 0
            ElseIf Rf = 10 Then
                Dv = "K"
            Else
                Dv = Rf
            End If
            If Rut(L - 1) <> Dv Then
                validar = False
            Else
                validar = True
            End If
            Return validar
        End Function

        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            If validarRun(UCase(TextBox1.Text)) = False Then
                MsgBox("El Run es icorrecto")
                TextBox1.Clear()
                TextBox1.Focus()
            Else
                TextBox1.Text = obtenerRut(UCase(TextBox1.Text))
            End If
        End Sub


    End Class


    viernes, 14 de febrero de 2020 16:52