应允许用户在文本框中仅输入小数值
监听此keydown事件,并将值与正则表达式
进行比较@"^((\+|-)?(\d*))+((\.|,)\d{0,5})?$";
这里的意图是将小数位数限制为6。
,用作欧洲语言的小数分隔符
数字的格式可以是
+100, 100
-100
.12
10.12 .....
如果以时尚方式输入的表达式可以正常工作
假设在文本框100.123456上输入了值 现在如果想修改上面的值如下
1100.123456
1001.123456
我无法修改,因为 Regex.IsMatch返回false,如果regex.ismatch返回false我正在抑制键事件
当100.123456修改为1100.123456时,为什么regex.ismatch返回false 我需要修改正则表达式
答案 0 :(得分:0)
你不能简单地设置文本框的属性或属性,使其只接受数字输入吗?
答案 1 :(得分:0)
我不会与正则表达式匹配,只需执行Double.TryParse
,如果正确解析则使用该数字。
您是否有理由要求它与RegEx完全匹配?
答案 2 :(得分:0)
如果要将小数点后的数字限制为6,则不应使用正则表达式
^((\+|-)?(\d*))+((\.|,)\d{0,6})?$
请注意,原始版本中的5将替换为6.您提供的值与正则表达式不匹配,因为它们在小数点后面有6位数字,而您的正则表达式预期在0到5之间。
答案 3 :(得分:0)
让我先说一下这句话:这是第三方控制最好处理的事情。这样,该解决方案可以完全处理极端情况和必要的测试。
KeyDown
事件将在控件中的文本发生更改之前触发。如果您要比较正则表达式中的文本框.Text
值,则不会有新值。
您可以尝试生成在允许密钥时创建的字符串,然后对其运行正则表达式。
(使用道具C# How to translate virtual keycode to 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;
}
}