Keypress ISSUE VB.NET

时间:2012-05-12 02:18:43

标签: regex vb.net visual-studio if-statement keypress

我花了很多时间试图解决我尝试过的这个问题,但没有成功。 我只需要验证文本框:

有效链:

10% 
 0% 
 1111111.12% 
 15.2% 
 10 
 2.3 

链条无效:

 .% 
 12.% 
 .02% 
 % 
 123456789123.123 

我需要使用这些有效链验证文本框,支持按键事件。

我试过:

Private Sub prices_KeyPress(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyPressEventArgs) Handles wholeprice_input_new_item.KeyPress, dozenprice_input_new_item.KeyPress, _
            detailprice_input_new_item.KeyPress, costprice_input_new_item.KeyPress

            Dim TxtB As TextBox = CType(sender, TextBox)
            Dim fullText As String = TxtB.Text & e.KeyChar
            Dim rex As Regex = New Regex("^[0-9]{1,9}([\.][0-9]{1,2})?[\%]?$ ")

            If (Char.IsDigit(e.KeyChar) Or e.KeyChar.ToString() = "." Or e.KeyChar = CChar(ChrW(Keys.Back))) Then
                If (fullText.Trim() <> "") Then
                    If (rex.IsMatch(fullText) = False And e.KeyChar <> CChar(ChrW(Keys.Back))) Then
                        e.Handled = True
                        MessageBox.Show("You are Not Allowed To Enter More then 2 Decimal!!")
                    End If
                End If
            Else
                e.Handled = True
            End If
        End Sub

注意:正则表达式必须使用可选的百分号进行验证(最多2个小数位和9个整数)。

请帮助,我感到非常沮丧,试图解决问题但没有成功

1 个答案:

答案 0 :(得分:1)

我认为你几乎得到了正确的答案。当我对你提供的样本运行正则表达式时,它们都会失败。但是,如果我在正则表达式的末尾删除额外的空间,我会得到预期的成功和失败。

所以目前你的正则表达式是这样的:

Dim rex As Regex = New Regex("^[0-9]{1,9}([\.][0-9]{1,2})?[\%]?$ ")

它应该看起来像

Dim rex As Regex = New Regex("^[0-9]{1,9}([\.][0-9]{1,2})?[\%]?$")

编辑:

好的,我更了解这个问题。正则表达式的问题在于,如果后跟一个或两个数字,它只允许一个句点。如果您在某人完成输入后评估文本框值,那么这样可以正常工作。但是在您的代码中,您正在评估每个按键,因此您没有机会在“。”之后键入数字。

我可以看到两种可能的解决方案

  1. 更改正则表达式以允许1.作为有效条目
  2. 在评估正则表达式时进行更改,或者尝试找出一种方法来仅在人员暂停键入时评估正则表达式。
  3. 如果你使用选项1,那么我们需要将正则表达式调整为类似

    "^[0-9]{1,9}((\.)|(\.[0-9]{1,2}(%)?)|(%))?$"
    

    我更改了正则表达式,以便它接受文本字符串(\.)的三个可选结尾将允许字符串在句点结束,(\.[0-9]{1,2}(%)?)将允许字符串结束句点后跟一个或两个数字和一个可选的百分号,(%)将允许字符串以百分号结束。我把结局分成了三个选项,因为我不想让12%这样的东西有效。此外,您还需要将百分号添加到第一个If语句

    If (Char.IsDigit(e.KeyChar) Or e.KeyChar.ToString() = "." Or e.KeyChar.ToString() = "%" Or e.KeyChar = CChar(ChrW(Keys.Back))) Then
    

    这样当有人输入百分号时,正则表达式就会运行。