論壇裡經常會問到如何判斷一個字符串是不是數字字符串的問題,而回答最多的就是自己寫,或者說一位一位的判斷。還有人說用isdigit(),isdigit能判斷嗎?看一下MSDN就知道了, 該函數原型是int isdigit( int c ); isdigit returns a non-zero value if c is a decimal digit (0 – 9)。isdigit是判斷一個字符是否是數字字符,而不是判斷字符串。
VC中沒有現成的函數,就要自己寫了。一個一個的判斷顯得有點麻煩,下面介紹一個簡單的方法。如下:
BOOL IsNumeric(LPCTSTR lpszStr)
{
char szTmp[MAX_PATH]="";
if(!*lpszStr)
return FALSE;
sscanf(lpszStr," %[.,0-9]",szTmp);
if(strcmp(lpszStr,szTmp))
return FALSE;
if(char *p=strstr(szTmp,"."))
if(p=strstr(p+1 , "."))
return FALSE;
return TRUE;
}
其實這個函數的關鍵點在於sscanf函數的格式符" %[.,0-9]%[^0-9]"。格式符中的%[]是過濾字符串,也就是在掃描字符串的時候,以[]中的字符作為基准,當遇到[]中沒有的字符,則當前輸入結束,進入下一個字符串的輸入。過濾字符通常以’,’ 號分隔,如果是連續的字符,則可以以 '-' 表示從哪個字符到哪個字符。如果以不包含某些字符作為過濾條件,則可以在第一個過濾字符前加一個 '^' 字符,相當於數學中的補集。
知道了sscanf的用法,再來看一個程序。
1. 首先看這個字符串是否為空,如果為空則返回FALSE;
判斷字符串是否為空,可以直接判斷第一個字符是否為0。
2. 掃描數字字符和小數點,將掃描結果存入szTmp. 如果掃描後獲得的字符串和原字符串不相同,則可以肯定該字符串不是數字字符串。
最後查找字符串中的小數點,如果有兩個小數點存在,則表示不是數字字符串。這個程序中,也將小數點在第一位的時候,做為數字字符串使用。
注意:本程序假設字符串前後沒有空格,如果有空格,可以先將空格去掉再做判斷。
发表于 2006-06-28 11:45 水石 阅读(1294)
re: 一個判斷字符串是否是數字字符串的方法!
日期: 2006-06-28 12:56
咋不用boost里面的转化?
哦,我沒研究過boost
日期: 2006-06-28 13:03
.
re: 一個判斷字符串是否是數字字符串的方法!
日期: 2006-06-28 13:26
不能判断正负?
0xab也是数呀? 函数名字有问题吧.
re: 一個判斷字符串是否是數字字符串的方法!
日期: 2006-06-28 13:29
IsNumeric("."); 这可是TRUE哦!
說的對,不過0xab個人認為不能當做數字字符串。改下程序再看看還有沒有問題。
日期: 2006-06-28 14:04
BOOL IsNumeric(LPCTSTR lpszStr)
{
char szTmp[MAX_PATH]="";
const char *pTmp=lpszStr;
if(!*lpszStr)
return FALSE;
*pTmp=='-'?pTmp++:pTmp;
sscanf(pTmp," %[.,0-9]",szTmp);
if(strcmp(pTmp,szTmp) || !strcmp(pTmp,"."))
return FALSE;
if(pTmp=strstr(szTmp,"."))
if(pTmp=strstr(pTmp+1 , "."))
return FALSE;
return TRUE;
}
re: 一個判斷字符串是否是數字字符串的方法!
日期: 2006-06-28 15:20
其实只要写每种表达方式的正则表达式就可以了,像
1.9e6
0xFF
082
111001b
这些都可以判断的。
re: 一個判斷字符串是否是數字字符串的方法!
日期: 2006-06-28 16:47
呵呵
其实自己写的一个个判断的方法简单实用高效,
因为这是实现基本原理。好看不一定就高效。没看到而已
确实比上面所列举的方法都要好
---------------------------------------------
以上言论,纯属无聊
--------------------next---------------------