您的位置:首页 > 编程语言 > C#

C#正则表达式文本框验证:只能输入整数和带两位小数的小数

2014-06-22 18:05 806 查看


C#正则表达式文本框验证:只能输入整数和带两位小数的小数

程序界面截图:



本文主要包含以下内容:

测试用例介绍;

测试用例下载地址;

文本框校验的解决思路;

参考资料;

一、测试用例介绍。

1、平台环境:Visual
Studio 2010,C#;

2、测试目的:

对于文本框数据输入的合法性进行自定义限制,本例要求只能够输入整数或小数(若为小数,小数点后只能保留两位)。

3、主要实现功能:

(1)匹配整数;

(2)匹配只保留两位小数位的小数;

(3)自动将全角数字转化为半角数字;

(4)文本框输入长度限制;

(5)文本框输入时禁用输入法;

(6)其他非法输入时锁定本控件,并提示错误。

4、程序界面截图:

如上图所示。

二、测试用例下载地址。

下载地址:测试Demo源码免积分下载

三、文本框校验的解决思路。

对于文本框输入的校验有不同的思路,本例采用了正则表达式匹配的方法。

1、即时验证:

为了即时对文本框内容进行验证,可以利用控件的validating事件,当控件失去焦点时,便会触发该事件。

2、正则表达式:

将要验证的有效格式写成正则表达式,不仅可以方便快捷地进行匹配,而且对于以后需求更改时也易于修改(只需修改正则表达式即可)。

利用正则表达式时,需要添加引用:< usingSystem.Text.RegularExpressions; >

3、验证完成:

验证通过后进行的操作可以使用控件的validated事件。例如,如果在验证不通过时有错误提示的话,那么验证通过时就可以给出验证通过的提示。该事件可根据实际需要选用。

4、正常退出:

在Validating事件中做验证处理时,如果验证不通过,本例希望焦点仍停留在该文本框内,即只有输入合法才能进行其他操作。这样的负作用之一就是用户在输入不合法时也无法正常退出程序,因此为使关闭程序的操作不受文本框验证的影响而正常使用,可以在FormClosing事件中添加e.Cancel=false来解决。

5、限制输入长度:

如果用户不小心压住了某个数字键,此时文本框里已经输入了100多位的数据,而且又恰好点击了“提交”按钮时,你能保证后台代码能接受这个结果吗?你如果也有这样的担心,那就试试控件的maxLength属性吧。

6、禁用输入法:

本例要求只能输入数字,因此如果禁用输入法后会省去很多麻烦。禁用后,无法直接输入中文,也无法“直接”输入全角字符。去查查控件的ImeMode属性,设置为disabled后就可以了。

7、全角字符串的处理:

知道上一步为什么说禁用输入法后无法“直接”输入全角字符吗?因为还可以“间接”输入!是的,那就是将全角字符串复制后粘贴过来。不要以为抽风的人才会这么无聊帮你去找Bug,程序员还是应该尽量把可能的异常先做好预防。(当然,禁用文本框的粘贴功能也不错,本例为照顾用户可能存在的粘贴较长数据的需要,没有禁用。大家可以自行搜下禁用粘贴的资料。)

如果文本框里含全角字符,在后期做数据运算时很容易出问题,本例解决方法是先检查,若是全角字符串则转换为半角字符串。

心得体会:

写出一个完全正确且符合自己要求的正则表达式确实需要好好构思,尤其是匹配内容较复杂时。但也不必担心,如果一个表达式完不成,可以写多个表达式然后“或”运算。在写正则表达式时不要盲目地参看网上已有的表达式,最好做个测试程序验证下,因为不同的语言正则表达式语法会有细微的不同。

对于正则表达式,大家先对照着MSDN上的介绍,熟悉每个符号的意思,再去理解别人写的表达式,慢慢就能写出自己的表达式了。对于正则表达式的理解,不妨想想中学学过的“排列组合”,会有用的。用排列组合把表达式中可能的各个分支完整走一遍,就都懂了。

主要参考代码:(详细代码可查看上面第二步中的“测试程序源码下载”)

//以下代码仅为示例,非全部代码,详细请查看下载地址提供的源码
private void tbInput_Validating(object sender, CancelEventArgs e)
{
string errorMsg;

if (!IsNumberic(tbInput.Text.Trim(), out errorMsg))
{
e.Cancel = true;
tbInput.Select(0, tbInput.Text.Length);
this.errorProvider1.SetError(tbInput, errorMsg);
//Console.WriteLine("输入非法!!");
}
}

#region 输入是否合法
public bool IsNumberic(string message, out string errorMsg)
{
//示例(非全部代码)
string temp = @"(^(\d(\.\d{2})?){1}$)";
Regex rex = new Regex(temp);

if (rex.IsMatch(message))
{
//...
}
else
{
//...
}
}
#endregion

public static bool IsSDC(string strSDC)
{
//...
}

public static string ToDBC(string strSBC)
{
//...
}

private void tbInput_Validated(object sender, EventArgs e)
{
//如果所有条件都满足的话,清除ErrorProvider中的错误信息。
errorProvider1.SetError(tbInput, "");
}

private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
//这里是为了确保关闭窗口功能不受影响
e.Cancel = false;
}


四、参考资料。

1、C#正则表达式:参考资料1 参考资料2

2、正则表达式匹配数字:参考资料3

3、C#全角和半角转换:参考资料4


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐