文本框只接受数值
本文关键字:文本 | 更新日期: 2023-09-27 17:52:42
应该允许用户在文本框中只输入十进制值
监听此keydown事件的,并将值与正则表达式
进行比较。@"^(('+|-)?('d*))+(('.|,)'d{0,5})?$";
这里的目的是将小数位限制为6。
,用作欧洲语言
的小数分隔符。数字的格式可以是
+100, 100
-100
.12
10.12 .....
如果在时尚中输入的表达式工作正常
假设文本框中输入的值为100.123456现在如果想修改上面的值,像下面的
1100.123456
1001.123456
我不能修改,因为正则表达式。IsMatch返回false,如果正则表达式。Ismatch返回false我正在抑制键事件
为什么正则表达式。当100.123456被修改为11000.123456时,Ismatch返回false是否需要修改正则表达式
难道不能简单地设置文本框的属性或属性,使其只接受数字输入吗?
我不会匹配一个正则表达式,只是做Double.TryParse
,如果它正确解析使用该数字。
是否有一个原因,你需要它匹配一个RegEx完全?
如果您想将小数点后的数字限制为6,您不应该使用Regex
^(('+|-)?('d*))+(('.|,)'d{0,6})?$
注意原来的5被6代替了。您提供的值与正则表达式不匹配,因为它们在小数点后有6位数字,而您的Regex期望在0到5之间(包括0到5)。
让我在回答这个问题之前先说:这类事情最好由第三方控件来处理。这样,解决方案就可以完全处理极端情况和必要的测试。
KeyDown
事件将在控件中的文本更改之前触发。如果你比较文本框的.Text
值在你的正则表达式,它不会有新的值。
您可以尝试生成在键被允许时将被创建的字符串,然后对它运行正则表达式。
(带道具到c#如何将虚拟键码转换为char?)[DllImport("user32.dll")]
static extern int MapVirtualKey(uint uCode, uint uMapType);
private void textBox1_KeyDown(object sender, KeyEventArgs e)
{
string number = textBox1.Text;
if ((e.KeyData & Keys.Delete) == Keys.Delete)
{
}
else if ((e.KeyData & Keys.Back) == Keys.Back)
{
}
else
{
// 2 is used to translate into an unshifted character value
int nonVirtualKey = MapVirtualKey((uint)e.KeyData, 2);
char mappedChar = Convert.ToChar(nonVirtualKey);
string proposedString = number.Remove(textBox1.SelectionStart, textBox1.SelectionLength).Insert(textBox1.SelectionStart, mappedChar.ToString());
bool works = Regex.IsMatch(proposedString, @"^(('+|-)?('d*))+(('.|,)'d{0,5})?$");
e.SuppressKeyPress = !works;
}
}