Chinaunix首页 | 论坛 | 博客
  • 博客访问: 468065
  • 博文数量: 724
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5010
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(724)

文章存档

2011年(1)

2008年(723)

我的朋友

分类:

2008-10-13 16:56:49

       論壇裡經常會問到如何判斷一個字符串是不是數字字符串的問題,而回答最多的就是自己寫,或者說一位一位的判斷。還有人說用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
    呵呵
    其实自己写的一个个判断的方法简单实用高效,
    因为这是实现基本原理。好看不一定就高效。没看到而已
    确实比上面所列举的方法都要好
    ---------------------------------------------
    以上言论,纯属无聊
  • 标题  
    姓名  
    主页
    验证码 *
    内容   
          
    [使用Ctrl+Enter键可以直接提交]

    --------------------next---------------------

    阅读(565) | 评论(0) | 转发(0) |
    给主人留下些什么吧!~~