如何只允许文本框vb.net中的数字和点

时间:2012-06-28 13:54:05

标签: vb.net textbox

我想知道如何让我的文本框只接受数字和点。像:

123.45 或115 或218.16978

等。

我已经得到以下代码:

Private Sub TxtHStof_KeyPress(ByVal sender As System.Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TxtHStof.KeyPress
    e.Handled = Not Char.IsDigit(e.KeyChar)

End Sub

但是这只允许没有点的数字。 我怎样才能改变代码所以它确实允许点,但没有别的。 (复制粘贴无关紧要,因为它不会成为问题)

非常感谢

15 个答案:

答案 0 :(得分:7)

e.Handled = Not (Char.IsDigit(e.KeyChar) OR e.KeyChar=".")

答案 1 :(得分:4)

无法接受的解决方案

  1. 多次输入小数,例如“ 12 .... 1234”
  2. 特定于操作系统的小数点分隔符

这对我有用

Private Sub TextBox1_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox1.KeyPress
    Dim DecimalSeparator As String = Application.CurrentCulture.NumberFormat.NumberDecimalSeparator
    e.Handled = Not (Char.IsDigit(e.KeyChar) Or
                     Asc(e.KeyChar) = 8 Or
                     (e.KeyChar = DecimalSeparator And sender.Text.IndexOf(DecimalSeparator) = -1))
End Sub

答案 2 :(得分:3)

您应该使用MaskedTextBox - 请参阅此处了解如何设置格式字符串(允许您仅限制数字和小数点)

http://msdn.microsoft.com/en-us/library/system.windows.forms.maskedtextbox.mask.aspx

答案 3 :(得分:1)

使用此代码,您可以使用',' (欧洲)和'。' (美国)小数。

Private Sub TGewicht_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TGewicht.KeyPress
    e.Handled = Not (Char.IsDigit(e.KeyChar) Or Asc(e.KeyChar) = 8 Or ((e.KeyChar = "." Or e.KeyChar = ",") And (sender.Text.IndexOf(".") = -1 And sender.Text.IndexOf(",") = -1)))
End Sub

答案 4 :(得分:1)

在MODULE o FORM中插入功能

Public Sub OnlyNumber(Ct As TextBox, MaxLength As Integer)
    Ct.MaxLength = MaxLength
    AddHandler Ct.KeyPress, AddressOf ValidarTeclaNumeros
End Sub

Private Sub ValidarTeclaNumeros(sender As Object, e As KeyPressEventArgs)
    Dim Ct As TextBox
    Ct = sender
    If [Char].IsDigit(e.KeyChar) OrElse [Char].IsControl(e.KeyChar) Then
        'ok 
        'e.Handled = True
    ElseIf [Char].IsPunctuation(e.KeyChar) Then
        If (Ct.Text.Contains(",") OrElse Ct.Text.Contains(".")) Then
            e.Handled = True
        End If


    Else
        e.Handled = True
    End If


End Sub

在加载表单中,为控件添加此代码仅为数字(并且只有一个逗号或文档)

OnlyNumber(txtControl, 10)

答案 5 :(得分:1)

我从大多数相同的问题开始,但我确实关心能够粘贴。在网上搜索如何做到这一点,我发现我真的应该处理:

  1. 句号或逗号作为小数指示符,具体取决于操作系统的设置方式。
  2. 仅允许符合模式的按键,同时仍然允许光标控制字符,如箭头和退格。
  3. 仅允许粘贴到符合模式的TextBox中。我选择的方式是,在粘贴时,代码将粘贴的文本视为文本被键入,因此粘贴" a1b.c2d,e3f.g4h,i5j"进入TextBox会显示为" 1.2345"如果句点是你的小数指标," 12,345"如果逗号是你的小数指示符。
  4. 我尝试了MaskedTextBox并且真的不喜欢它,因为它强制执行小数点位置,我真的只想自由填写任何数字。我可能已经使用RegEx进行模式匹配,但现在我应该可以在任何地方重复使用此代码。

    Public Class frmMain
    
        Dim RegexValidator As System.Text.RegularExpressions.Regex
        Dim FormLoaded As Boolean = False
    
        Private Sub frmMain_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
            Dim RegexDecimalPattern As String = Globalization.CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator
            RegexDecimalPattern = IIf(RegexDecimalPattern = ".", "\.", RegexDecimalPattern)
            RegexValidator = New System.Text.RegularExpressions.Regex("^\d*" & RegexDecimalPattern & "?\d*$", System.Text.RegularExpressions.RegexOptions.IgnoreCase)
            FormLoaded = True
        End Sub
    
        Private Sub TextBox1_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox1.KeyPress
            ' Code below is based on
            ' http://www.vbforums.com/showthread.php?626378-how-to-validate-textbox-allows-only-numeric-and-decimal-in-vb-net
            ' but was modified to be based on Regex patterns.
            '
            ' Note that:
            ' KeyPress event validation covers data entry as it is being typed.
            ' TextChanged event validation covers data entry by cut/pasting.
            If Char.IsControl(e.KeyChar) Then
                'Allow all control characters.
            Else
                Dim Text = Me.TextBox1.Text
                Dim SelectionStart = Me.TextBox1.SelectionStart
                Dim SelectionLength = Me.TextBox1.SelectionLength
                Text = Text.Substring(0, SelectionStart) & e.KeyChar & Text.Substring(SelectionStart + SelectionLength)
                If Not RegexValidator.IsMatch(Text) Then e.Handled = True
            End If
        End Sub
    
        Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
            ' If default text is used in a textbox, a TextChanged event occurs before 
            ' RegexValidator is initialized during the Form Load, so we need to check. 
            If FormLoaded Then
                ' Note that:
                ' KeyPress event validation covers data entry as it is being typed.
                ' TextChanged event validation covers data entry by cut/pasting.
                Dim Text = Me.TextBox1.Text
                Dim ValidatedText As String = ""
                Dim KeyChar As Char
                For Each KeyChar In Text
                    If RegexValidator.IsMatch(ValidatedText + KeyChar) Then ValidatedText += KeyChar
                Next
                If (ValidatedText.Length > 0) And (TextBox1.Text <> ValidatedText) Then
                    Me.TextBox1.Text = ValidatedText
                    Me.TextBox1.SelectionStart += ValidatedText.Length
                End If
            End If
        End Sub
    End Class
    

答案 6 :(得分:0)

来自C#,而不是VB,我正在尝试这一点,但这会有效:

e.Handled = Not (Char.IsDigit(e.KeyChar) AndAlso e.KeyChar.Equals('.'))

答案 7 :(得分:0)

Private Sub TextBox2_KeyPress(
   ByVal sender As Object,
   ByVal e As System.Windows.Forms.KeyPressEventArgs
) Handles TextBox2.KeyPress

    e.Handled = Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = "." Or Asc(e.KeyChar) = 8)
End Sub

答案 8 :(得分:0)

    '****To Allow only Numbers with Decimal and BACKSPACE enabled****
    If Not (Char.IsDigit(e.KeyChar) Or e.KeyChar = ".") And Not Char.IsControl(e.KeyChar) Then
        e.Handled = True
    End If

答案 9 :(得分:0)

只需添加另一个解决方案。此代码限制用户仅输入一个“”。小数点,只有小数点后两位可以设置要使用的位数(目前,我将其设置为最多允许小数点前最多5个整数。还允许使用退格键和删除键。这样,它们不能用多余的“。”加粗,最后得到“ 45.5.5”之类的字样。

If Char.IsControl(e.KeyChar) Then
        ElseIf Char.IsDigit(e.keyChar) OrElse e.keyChar = "."c Then


            If Amount_FundedTextBox.TextLength = 5 And Amount_FundedTextBox.Text.Contains(".") = False Then
                Amount_FundedTextBox.AppendText(".")
            ElseIf e.KeyChar = "." And Amount_FundedTextBox.Text.IndexOf(".") <> -1 Then
                e.Handled = True
            ElseIf Char.IsDigit(e.KeyChar) Then
                If Amount_FundedTextBox.Text.IndexOf(".") <> -1 Then
                        If Amount_FundedTextBox.Text.Length >= Amount_FundedTextBox.Text.IndexOf(".") + 3 Then
                            e.Handled = True
                        End If
                    End If
                End If

            Else
                e.Handled = True
        End If

答案 10 :(得分:0)

尝试一下

If Asc(e.KeyChar) <> 13 AndAlso Asc(e.KeyChar) <> 8 _
AndAlso Asc(e.KeyChar) <> 46 And Not IsNumeric(e.KeyChar) Then

e.Handled = True

End If

答案 11 :(得分:0)

您可以通过添加“ KeyPress”处理程序(来自TextBox属性)并指定允许的字符来限制文本框中的字符输入。如果字符是“已处理”,则不允许使用。

Private Sub TextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles TextBox.KeyPress
    Dim txt As TextBox = CType(sender, TextBox)

    If Not ((Char.IsDigit(e.KeyChar)) Or (e.KeyChar = "E") Or (e.KeyChar = "e") Or (e.KeyChar = "-")) Then e.Handled = True
    If e.KeyChar = Chr(8) Then e.Handled = False 'allow Backspace
    If e.KeyChar = "." And txt.Text.IndexOf(".") = -1 Then e.Handled = False 'allow single decimal point
    If e.KeyChar = Chr(13) Then GetNextControl(txt, True).Focus() 'Enter key moves to next control
End Sub

答案 12 :(得分:0)

Private Sub TextBox4_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TextBox4.KeyPress

        ' its worked for only number with point and worked backspace 
        If Not Char.IsDigit(e.KeyChar) And Not e.KeyChar = "." Then
            e.Handled = True
        End If
        If e.KeyChar = "." And TextBox4.Text.IndexOf(".") <> -1 Then
            e.Handled = True
        End If
        If e.KeyChar = "." Then
            e.Handled = False
        End If
        If e.KeyChar = Chr(Keys.Back) Then
            e.Handled = False
        End If
        If Char.IsDigit(e.KeyChar) Then
            If TextBox4.Text.IndexOf(".") <> -1 Then
                If TextBox4.Text.Length >= TextBox4.Text.IndexOf(".") + 3 Then  'replace 2 for greater numbers after decimal point
                    e.Handled = True
                    TextBox4.Focus()
                End If
            End If
        End If
        ' is for only digit with back space 
        e.Handled = Not Char.IsDigit(e.KeyChar)

        If e.KeyChar = Chr(Keys.Back) Then
            e.Handled = False
        End If
        If Char.IsDigit(e.KeyChar) Then
            If TextBox4.Text.IndexOf(".") <> -1 Then
                If TextBox4.Text.Length >= TextBox4.Text.IndexOf(".") + 3 Then  'replace 2 for greater numbers after decimal point
                    e.Handled = True
                    TextBox4.Focus()
                End If
            End If
        End If
    End Sub

答案 13 :(得分:0)

晚会晚了,但这是我的密码

  Private Sub LoanFeeTextBox_KeyPress(sender As Object, e As KeyPressEventArgs) Handles LoanFeeTextBox.KeyPress
        If Char.IsControl(e.KeyChar) Then
        ElseIf Char.IsDigit(e.KeyChar) OrElse e.KeyChar = "."c Then
            If LoanFeeTextBox.TextLength = 12 And LoanFeeTextBox.Text.Contains(".") = False Then
                LoanFeeTextBox.AppendText(".")
            ElseIf e.KeyChar = "." And LoanFeeTextBox.Text.IndexOf(".") <> -1 Then
                e.Handled = True
            ElseIf Char.IsDigit(e.KeyChar) Then
                If LoanFeeTextBox.Text.IndexOf(".") <> -1 Then
                    If LoanFeeTextBox.Text.Length >= LoanFeeTextBox.Text.IndexOf(".") + 3 Then
                        e.Handled = True
                    End If
                End If
            End If

        Else
            e.Handled = True
        End If
    End Sub

答案 14 :(得分:-1)

Dim e As System.Windows.Forms.KeyPressEventArgs

    If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then
        e.Handled = True
    Else
        e.Handled = False
    End If