凯锐
博客园
::
首页
::
新随笔
::
联系
::
订阅
::
管理
::
96 随笔 :: 39 文章 :: 212 评论 :: 23 引用
在C#.Net中判斷輸入的字串是否是數字的方法
在Textbox的輸入中﹐我們常常需要控制輸入的類型﹐比如說只能輸入數字﹐當然實現的方法很多﹐我總結了一下我做過的一些項目﹐我常會使用以下這三種﹕
1﹑使用Try...Catch
private
static
bool
IsNumeric(
string
itemValue,
int
intFLag)
{
try
{
int
i
=
Convert.ToInt32(itemValue);
return
true
;
}
catch
{
return
false
;
}
}
2﹑使用正則表達式
using
System.Text.RegularExpressions;
private
static
bool
IsNumeric(
string
itemValue)
{
return
(IsRegEx(
"
^(-?[0-9]*[.]*[0-9]{0,3})$
"
, itemValue));
}
private
static
bool
IsRegEx(
string
regExValue,
string
itemValue)
{
try
{
Regex regex
=
new
System.Text.RegularExpressions.Regex(regExValue);
if
(regex.IsMatch(itemValue))
return
true
;
else
return
false
;
}
catch
(Exception )
{
return
false
;
}
finally
{
}
}
3﹑判斷輸入的keyCode
public
static
bool
IsNumeric(System.Windows.Forms.KeyPressEventArgs e)
{
if
((e.KeyChar
>=
(
char
)
48
&&
e.KeyChar
<=
(
char
)
57
)
||
e.KeyChar
==
(
char
)
8
||
e.KeyChar
==
(
char
)
45
||
e.KeyChar
==
(
char
)
47
)
{
}
else
{
e.Handled
=
true
;
}
return
true
;
}
posted on 2006-03-01 16:15
凯锐
阅读(2497)
评论(8)
编辑
收藏
所属分类:
C# Programing
评论
#1楼
2006-03-02 17:24
东海风
第一种方法利用了异常机制,检测结果可靠但效率较低。不过楼主在程序中用了Convert.ToInt32,应该是检查整数的方法,好象与以下两种方法的检测范围不一致。
第二种用正则表达式相对高效,但表达式中对.(Dot)的检测存在问题,会将连接几个小数点检测为合法。
如果利用第三种方法检测,则漏洞就非常多了:1.如果利用中文输入法,完全可以输入汉字或全角字符。2.用粘贴方法可输入任意字符。3.无法处理诸如负数、小数点之类的问题。
回复
引用
查看
#2楼
[
楼主
]
2006-03-02 18:18
精浪
@东海风
真是明眼人﹐第一種方法確實是只檢測0~9的整數的﹗
第二種方法﹐說實在的﹐你是第一個幫我指出來的。謝謝﹗
return (IsRegEx(@"^\-?\(?([0-9]{0,3}(\,?[0-9]{3})*(\.?[0-9]*))\)?$", itemValue));
第三種方法﹐我是在KeyPress中調用﹐如果粘貼過來的是無法保存的(因為我是有綁定數據﹐綁定的類型是數值型)。而且是無法輸入漢字的﹐你可以試試。
當然﹐要禁止粘貼的話﹐我是有寫一個新Textbox控件的﹐一并將源碼貼出來﹕
///
/// 只有輸入數字的TextBox控件﹐如果去掉ProcessKeyEventArgs方法﹐而可實現只粘貼數字。
///
[Designer(typeof(NumberTextBox.NumberTextBoxDesigner))]
public class NumberTextBox:System.Windows.Forms.TextBox
{
public const int WM_PASTE = 0x0302;//粘貼消息
public const int WM_CHAR = 0x0102;//輸入字符消息(鍵盤輸入的)
[DllImport("user32.dll")]
public static extern bool MessageBeep(uint UType);
protected override bool ProcessKeyEventArgs(ref Message m)
{
int nKey = m.WParam.ToInt32();
if ((nKey >= (char)48 && nKey<=(char)57) ||
nKey ==(char)8 || nKey ==(char)45 || nKey ==(char)46)
{
return base.ProcessKeyPreview(ref m);
}
else
{
if (m.Msg==256 && nKey ==46)
return base.ProcessKeyPreview(ref m);
if (m.Msg ==258)
{
MessageBeep(0);
}
}
return true;
}
protected override void WndProc(ref Message m)
{
if(m.Msg == WM_CHAR)//取m.WParam 進行判斷m.WParam 就是用戶輸入的字元的 int 表示方式,如果是被限制的字元直接 Return不走base.WndProc(ref m);
{
int keyChar = m.WParam.ToInt32();
bool charOk=(keyChar>47 && keyChar<58) || //數字
keyChar==8 || //退格
keyChar==3 || keyChar==22 || keyChar==24;//拷貝﹑粘貼﹑刪除
if(!charOk)return;
}
if(m.Msg == WM_PASTE)//判斷剪貼板的資料是否是符合要求如果符合不做任何處理否則 Return不走base.WndProc(ref m)
{
IDataObject iData = Clipboard.GetDataObject();//取剪貼板物件
if(iData.GetDataPresent(DataFormats.Text)) //判斷是否是Text
{
string str;
str = (String)iData.GetData(DataFormats.Text); //取資料
/*如果需要正負號,先要判斷TextBox 上游標的位置,如果游標在最前面可以用這個,^(((\+|-)\d)?\d*)$ */
if (!System.Text.RegularExpressions.Regex.IsMatch(str,@"^(\d{1,})$")) return;//如果是數位(可以粘貼跳出)
}
}
base.WndProc (ref m);
}
internal class NumberTextBoxDesigner:ControlDesigner
{
protected override void PostFilterProperties(System.Collections.IDictionary properties)
{
properties.Remove("Text");
}
}
}
回复
引用
查看
#3楼
2006-09-04 13:23
gzj [未注册用户]
用Int.tryParse方法
回复
引用
#4楼
[
楼主
]
2006-09-04 19:15
精浪
@gzj
这个是2.0才有的方法,在VS.Net2003版中还没有这个方法呢!
回复
引用
查看
#5楼
2007-03-15 16:02
堅 [未注册用户]
double dTmp;
if(double.TryParse(Request["ver"].ToString().Trim(),System.Globalization.NumberStyles.Integer,null,out dTmp))
{
// number
}
else
{
// not number
}
回复
引用
#6楼
2008-03-27 14:22
wingfay
谢谢你提供的方法
Int.tryParse 虽然好 如果数字长度过大也是不能检测的
回复
引用
查看
#7楼
2008-03-27 14:39
费哥
判斷輸入的keyCode从没试过,有机会试试看
回复
引用
查看
#8楼
2008-09-01 22:47
addongo [未注册用户]
不好意思那請問如果還要區分全形長度是2,半形長度是1,該如何判斷呢?ex:全形數字8長度為2,半形數字8長度為1,謝謝
回复
引用
新用户注册
刷新评论列表
标题
姓名
主页
Email
(博主才能看到)
验证码
*
看不清,换一张
[
登录
][
注册
]
内容(请不要发表任何与政治相关的内容)
网站首页
新闻频道
社区
小组
博问
网摘
闪存
找找看
Remember Me?
登录
使用高级评论
新用户注册
返回页首
恢复上次提交
[使用Ctrl+Enter键可以直接提交]
相关文章:
C#字符串分割
如何配置C#命令行编译器
一个绝对有效的治疗“寻常疣(干日疮,瘊子)”的方法
电脑故障处理小经验—IE无法打开链接的处理方法
FileInfo 复制文件 是否完成 如何判断 C#
C# 外网如何用TCP向内网传文件?
C# 来这里学习C#吧
C# 委托
相关链接:
所属分类的其他文章:
WinForm下多层架构的实现
從無到有實現一個xml數據庫登錄驗証
產生指定個數的不重復隨機數
國際化你的程序
FileLoad Word Excel文檔
擴展PictureBox的一個組件(2)
将PUBS中的所有用户表内容分别用xml文件导出
讓combobox也綁定數據表
再现C#导出Excel源码
VS.NET2005的特色之一:程式碼片段-補充
最新IT新闻:
Google开拓美政府机构市场 微软业务受冲击
消息称苹果正在开发iTunes网络电视
微软周一开电话会议 预计将发布Silverlight2.0
开心网即将启用”shejiao.com”?
Google股价跌破329美元 61%员工期权价值归零
公告
与我联系
发短消息
搜索
常用链接
我的随笔
我的空间
我的短信
我的评论
更多链接
我的参与
我的新闻
最新评论
我的标签
我参加的小组
Visual Basic
我参与的团队
深圳.NET俱乐部(0/1619)
Dot Net Web服务和Windows服务开发(0/234)
湖南.NET俱乐部(0/613)
Visual Basic 团队(0/170)
我的标签
.NET
(1)
WCF
(1)
Remoting
(1)
VS2008
(1)
CrystalReport XI R2
(1)
CrystalReport 11
(1)
VS2005
(1)
Dynamic display CR
(1)
随笔分类
.Net Remoting(6)
(rss)
ASP.NET Design(8)
(rss)
C# Programing(21)
(rss)
Design & Pattern(3)
(rss)
Office VBA (3)
(rss)
Regular Expression(2)
(rss)
SQL Programing(15)
(rss)
Symbian(1)
(rss)
VB.NET(5)
(rss)
個性人生(18)
(rss)
随笔档案
2008年7月 (1)
2008年4月 (1)
2007年11月 (1)
2007年10月 (3)
2007年8月 (1)
2007年6月 (1)
2007年5月 (1)
2007年3月 (1)
2007年1月 (1)
2006年12月 (3)
2006年11月 (5)
2006年10月 (8)
2006年9月 (12)
2006年8月 (5)
2006年7月 (3)
2006年6月 (27)
2006年5月 (4)
2006年4月 (3)
2006年3月 (6)
2006年2月 (9)
文章分类
C# Knowledge(9)
(rss)
CSDN上的強貼(2)
(rss)
Plugin(1)
(rss)
Sql Server2K5
(rss)
SqlKnowledge(8)
(rss)
Xml(1)
(rss)
收藏夹
ASP.NET(14)
(rss)
Aspect Oriented Programming(4)
(rss)
Delegate(4)
(rss)
EffectiveC#(22)
(rss)
Miscellaneous(19)
(rss)
PlugIn(6)
(rss)
Remoting(15)
(rss)
Sql Server2K(10)
(rss)
Sql Server2K5(1)
(rss)
Symbian (1)
(rss)
Virtural Colleague Case(1)
(rss)
常逛BLOG
『 天道酬勤 』
200Disk網盤
Google Analytics
呂震宇
我的CSDN Blog
常逛Forum
51腳本
eggheadcafe
IT PUB
MSDN微軟中國
中國DotNet論壇
開源社區
123aspx
C#Corner
C#Help
Codeproject
gfprge
Google CodeSearch
英語學習
Google Translator
成人學位英語
(rss)
人大劉本政的博客
天天學英語
育路教育社區
(rss)
中國教育第一社區
最新评论
1. re: 在C#.Net中判斷輸入的字串是否是數字的方法
不好意思那請問如果還要區分全形長度是2,半形長度是1,該如何判斷呢?ex:全形數字8長度為2,半形數字8長度為1,謝謝
--addongo
2. re: SQL 語句積累
取得特定表的列名:select name from syscolumns where id=(select max(id) from sysobjects where xtype='u' and na...
--凯锐
阅读排行榜
1. C#導出Excel源碼(9599)
2. 再现C#导出Excel源码(7269)
3. WinForm下多层架构的实现(6026)
4. 基於IIS的WCF的分布式多層架構開發實現(2559)
5. 在C#.Net中判斷輸入的字串是否是數字的方法(2497)
评论排行榜
1. WinForm下多层架构的实现(52)
2. C#導出Excel源碼(29)
3. 再现C#导出Excel源码(15)
4. 從無到有實現一個xml數據庫登錄驗証(15)
5. 基於IIS的WCF的分布式多層架構開發實現(15)
Powered by:
博客园
Copyright © 凯锐