0

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

有效链:

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 个整数)。

请帮忙,我很沮丧试图解决这个问题而没有成功

4

1 回答 1

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. 在评估正则表达式时进行更改,也许试图找出一种仅在该人暂停输入时才评估正则表达式的方法。

如果您选择选项 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

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

于 2012-05-12T03:39:34.717 回答