Autor Tema: Error visual basic al usar comas en numeros en los textbox separador decimal  (Leído 2516 veces)

aorozco

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 1
    • Ver Perfil
Hola,
Soy nuevo en el foro pero tengo un problema con un programa en Visual Basic ultima versión al momento de colocar los datos. Pues la respuesta que me debe dar es 0.25 y al ingresar los valores con (.) me da 5.015 y si los ingreso con (,) no me corre el programa y se detiene. el código que uso es el siguiente:
       
 
Código: [Seleccionar]
Dim Qd, ks, dd, Ec, Ev, dh, l, z2, H, p, u, km, di, g, visc, hf1, v, Q, hf2, er As Double
        Qd = TextBox1.Text
        ks = TextBox2.Text
        dd = TextBox3.Text
        Ec = TextBox4.Text
        Ev = TextBox5.Text
        dh = TextBox6.Text
        l = TextBox7.Text
        z2 = TextBox8.Text
        H = TextBox9.Text
        p = TextBox10.Text
        u = TextBox11.Text
        km = TextBox12.Text
        di = TextBox13.Text

        g = 9.81
        visc = u / p
        hf1 = H - z2

        Dim comprobacion As Boolean
        comprobacion = False

        Do Until (comprobacion.Equals(True))

            v = ((-2 * Math.Sqrt(2 * g * di * hf1)) / Math.Sqrt(l)) * Math.Log10(((ks) / (3.7 * di)) + ((2.51 * visc * Math.Sqrt(l)) / (di * Math.Sqrt(2 * g * di * hf1))))
            Q = v * (Math.PI) * (di ^ 2) / 4

            Dim comprobacion1 As Boolean
            comprobacion1 = False

            Do Until (comprobacion1.Equals(True))

                If (Q >= Qd) Then
                    comprobacion1 = True
                Else
                    di = di + dd
                    v = ((-2 * Math.Sqrt(2 * g * di * hf1)) / Math.Sqrt(l)) * Math.Log10(((ks) / (3.7 * di)) + ((2.51 * visc * Math.Sqrt(l)) / (di * Math.Sqrt(2 * g * di * hf1))))
                    Q = v * (Math.PI * (di ^ 2) / 4)
                End If

            Loop
            'La parte de peridas altas va desde aca'

            Dim vp As Double

            vp = Math.Sqrt((2 * g * H) / (km))

            Dim comprobacionv As Boolean
            comprobacionv = False

            Do Until (comprobacionv.Equals(True))

                If (v < vp) Then
                    comprobacionv = True
                    'el procedimiento A va desde aca'
                Else
                    hf1 = 0.000001
                    Do Until (comprobacionv.Equals(True))
                        v = ((-2 * Math.Sqrt(2 * g * di * hf1)) / Math.Sqrt(l)) * Math.Log10(((ks) / (3.7 * di)) + ((2.51 * visc * Math.Sqrt(l)) / (di * Math.Sqrt(2 * g * di * hf1))))
                        Q = v * (Math.PI * (di ^ 2) / 4)

                        Dim comprovacionv1 As Boolean
                        comprovacionv1 = False

                        Do Until (comprovacionv1.Equals(True))

                            If (Q > Qd) Then
                                comprovacionv1 = True
                            Else
                                di = di + dd
                                v = ((-2 * Math.Sqrt(2 * g * di * hf1)) / Math.Sqrt(l)) * Math.Log10(((ks) / (3.7 * di)) + ((2.51 * visc * Math.Sqrt(l)) / (di * Math.Sqrt(2 * g * di * hf1))))
                                Q = v * (Math.PI * (di ^ 2) / 4)
                            End If

                        Loop

                        vp = Math.Sqrt((2 * g * (H - hf1)) / km)

                        If ((Math.Abs(v - vp)) < Ev) Then
                            comprobacionv = True
                        Else
                            If (v < vp) Then
                                hf1 = hf1 + dh
                            Else
                                hf1 = hf1 - dh
                            End If
                            di = 0.015
                        End If
                    Loop
                End If
            Loop

            'La parte de peridas altas va hasta aca'

            hf2 = H - z2 - (v ^ 2 / (2 * g))

            Dim comprobacion2 As Boolean
            comprobacion2 = False

            Do Until (comprobacion2.Equals(True))

                If ((Math.Abs(hf1 - hf2) <= er)) Then
                    comprobacion2 = True
                Else
                    v = ((-2 * Math.Sqrt(2 * g * di * hf2)) / Math.Sqrt(l)) * Math.Log10(((ks) / (3.7 * di)) + ((2.51 * visc * Math.Sqrt(l)) / (di * Math.Sqrt(2 * g * di * hf2))))
                    Q = v * (Math.PI * (di ^ 2) / 4)
                    hf1 = hf2
                    hf2 = H - z2 - (v ^ 2 / (2 * g))
                End If

            Loop

            If (Q >= Qd) Then
                comprobacion = True
            Else
                comprobacion = False
            End If

            Label14.Text = "d = " + di.ToString

        Loop
    End Sub


Los valores en los cuadros de texto son en orden: 0.12, 0.00015, 0.005, 0.01, 0.01, 0.05, 17, 0, 2.2, 999.3, 0.00117, 4.3, 0.1.

Si alguien me puede ayudar es URGENTE  :(
« Última modificación: 31 de Mayo 2017, 19:44 por Ogramar »

Ogramar

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2662
    • Ver Perfil
Buenas, puede intentarse la sustitución del separador decimal por el separador correcto (según la configuración regional)

La idea para un textbox es esta:

Código: [Seleccionar]
Private Sub TextBoxOnKeyPress(sender As Object, e As KeyPressEventArgs)

    If ((e.KeyChar = "."c) OrElse (e.KeyChar = ","c)) Then
        ' Obtenemos el carácter separador decimal existente
        ' actualmente en la configuración regional de Windows.
        '
        e.KeyChar = _
            Threading.Thread.CurrentThread. _
            CurrentCulture.NumberFormat.NumberDecimalSeparator.Chars(0)

    End If

End Sub

Y generalizado para todos los textbox:

Código: [Seleccionar]
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

    ' Instalamos el controlador para el evento KeyPress
    ' de todos los controles TextBox existentes en
    ' el formulario.
    '
    For Each ctrl As Control In Controls

        If (TypeOf ctrl Is TextBox) Then _
            AddHandler ctrl.KeyPress, AddressOf TextBoxOnKeyPress

    Next

End Sub

Habría otras formas de hacerlo, por ejemplo con funciones para cadenas

Salu2

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".