检查文本框输入是不是为数字

Posted

技术标签:

【中文标题】检查文本框输入是不是为数字【英文标题】:Checking to see if text box input is numeric检查文本框输入是否为数字 【发布时间】:2013-03-15 01:19:37 【问题描述】:

我已经对此进行了一些研究,但仍然无法让我的程序运行。我只需要检查文本框以查看用户输入是否为数值(“。”和或“/”除外)

到目前为止我的代码,

 Private Sub Num1_KeyPress(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Num1.KeyPress
    Dim UserEntry As Boolean
    If UserEntry = IsNumeric(False) Then
        MessageBox.Show("That's not numeric!")
    End If
End Sub

【问题讨论】:

对于像 3.45 这样的小数,它可以是像 1/2 这样的分数吗? 是的,这就是为什么我需要排除字符“。”和比较中的“/”。对不起,我刚刚自学VB.NET,这样的过程对我来说还是新的。 您可以使用开箱即用的具有此功能的 NumericUpDown1 如果输入的文本是数字,而不是陷印。为什么不将文本框接受的字符限制为仅 0123456789./ 和 Backspace? @Ruben 这会将3.4.5.6 视为数字。 【参考方案1】:

我建议处理 TextChanged 并检查整数而不是单个字符。

Private Sub Num1_TextChanged(sender As Object, e As TextChangedEventArgs) Handles Num1.TextChanged
        If IsInputNumeric(Num1.Text) Then
            'handle numeric input
        Else
            'handle not a number
        End If
    End Sub

    Private Function IsInputNumeric(input As String) As Boolean
        If String.IsNullOrWhiteSpace(input) Then Return False
        If IsNumeric(input) Then Return True
        Dim parts() As String = input.Split("/"c)
        If parts.Length <> 2 Then Return False
        Return IsNumeric(parts(0)) AndAlso IsNumeric(parts(1))
    End Function

【讨论】:

感谢特雷弗的回复!它比 AbZy 的更详细,我选择他作为这个(特定)问题的答案,但你的解决方案更准确,我感谢你抽出时间帮助我解决这个问题,因为你应该得到很多支持!【参考方案2】:

我认为你最好使用TextBox.KeyUp 事件,它通过KeyEventArgs。试试这个:

Private Sub Num1_KeyUp(sender As System.Object, e As System.Windows.Forms.KeyEventArgs) Handles Num1.KeyUp

    Dim isDigit As Boolean = Char.IsDigit(ChrW(e.KeyValue))
    Dim isKeypadNum As Boolean = e.KeyCode >= Keys.NumPad0 And e.KeyCode <= Keys.NumPad9
    Dim isBackOrSlashOrPeriod As Boolean = (e.KeyCode = Keys.Decimal Or e.KeyCode = Keys.Oem2 Or e.KeyCode = Keys.Back Or e.KeyCode = Keys.OemPeriod)

    If Not (isDigit Or isKeypadNum Or isBackOrSlashOrPeriod) Then
        MessageBox.Show("That's not numeric!")
    End If

End Sub

【讨论】:

这似乎不起作用,它只省略了文本框中第一个“空格”、字母或数字的消息框,然后为之后的每个输入提供消息框,无论是数字、字母、正斜杠或退格。 你的函数运行良好!我知道的一个问题是键盘的遗漏?键盘是否属于不同的分类?因为当我通过键盘输入数值时也会出现消息框。 @Matt 我现在修好了。是的,它们有不同的键码。【参考方案3】:
Public Function onlyNumbers(ByVal KeyChar As Char) As Boolean
    Dim allowedChars As String

    allowedChars = "0123456789./" 

    If allowedChars.IndexOf(KeyChar) = -1 And (Asc(KeyChar)) <> 8 Then 
        Return True
    End If

    Return False
End Function

true 表示无效字符。

在按键时你需要做的:

e.handled = onlyNumbers(e.keychar)

【讨论】:

不是-2 number 吗? 2.2.2.2. 是一个数字吗?【参考方案4】:

我发现这种验证更容易在文本框的LostFocus eventHandler 中进行,或者在表单级别,例如当用户点击确定按钮时。

然后您可以按如下方式进行验证

a) 文本框是否包含"0123456789./" 之外的任何字符如果是,则为非数字

b) 在出现"/" 字符的地方(如果有)拆分文本,然后对每个子字符串使用IsNumeric() 函数。如果其中任何一个不是数字,则文本不是数字。

这确实假设您允许 1/2/2,即1/4。如果不是,那么您还必须检查您的字符串中是否最多有 1 个“/”字符。

【讨论】:

【参考方案5】:
Private Sub tbYear_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles tbYear.KeyPress
    If e.KeyChar < Chr(48) Or e.KeyChar > Chr(57) Then
        e.KeyChar = Nothing
    End If
End Sub

【讨论】:

【参考方案6】:
' Validates textboxes for numeric only keystrokes.  Hook this up to the 
' PreviewTextInput of the desired textbox
Private Sub SetTextboxNumericOnly(sender As Object,
                                  e As TextCompositionEventArgs)

    Dim regex As New System.Text.RegularExpressions.Regex("[^0-9]+")
    e.Handled = regex.IsMatch(e.Text)

End Sub

请记住,您仍然需要检查文本框是否包含值,以防他们删除文本框的内容。此例程确保它始终是数字,因此不再需要检查。

【讨论】:

【参考方案7】:

稍微切题,根据问题checking for numeric value entered in text box in visual basic的最高答案,还有方法.TryParse被认为是比IsNumeric更好的解决方案:

第一个原因是,使用 TryParse 您还可以获得转换结果,而使用 IsNumeric 您必须在检查后进行转换。

第二个原因是你可以给 IsNumeric 任何你想要的对象(例如也是一个按钮)并且它接受它。你永远不会在编译时发现这种错误。相反,使用 TryParse,您只能将字符串作为其第一个参数传递。

【讨论】:

以上是关于检查文本框输入是不是为数字的主要内容,如果未能解决你的问题,请参考以下文章

如何检查是不是在 KeyUp 事件的文本框中输入了数字或字母 [重复]

检查文本框内容是不是为数字[重复]

C# 文本框只能输入数字

c#中如何判断文本框中是不是是数字(包括小数)

c#如何判断文本框中是不是是数字

js判断文本框只能输入中文和英文,如果不是就弹出对话框提示