我花了很多时间试图解决我尝试过的这个问题,但没有成功。 我只需要验证文本框:
有效链:
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个整数)。
请帮助,我感到非常沮丧,试图解决问题但没有成功
答案 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,那么我们需要将正则表达式调整为类似
"^[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
这样当有人输入百分号时,正则表达式就会运行。