如何验证字符串是否为数字和/或一个字符"。"被允许

时间:2014-12-09 18:28:45

标签: c++ string iterator numeric

我正在尝试验证字符串是否包含数字。我想看看字符串是否包含不允许的字符或更多字符,例如非数字和/或一个字符"。"

我的代码是

//this code is call function (is_number). sTempArray[3] is amount such as $00.00
if(!is_number(sTempArray[3]))
{
    cout << "Your amount have letter(s) are not allowed!;
}

//the is_number is function and will run if anyone call this function.
bool MyThread::is_number(const string& data)
{
    string::const_iterator it = data.begin();
    while (it != data.end() && std::isdigit(*it))
    {
        ++it;
    }
    return !data.empty() && it == data.end();
}

我想验证字符串是否允许。例如,string有一个值,它是500.00并且它将被允许但是它总是被拒绝,因为句点字符在字符串中。另一个例子,字符串有一个值,它是500.00a,不应该被允许。

2 个答案:

答案 0 :(得分:0)

在is_number函数的while循环中,您可以添加if语句来检查当前迭代是否为数字或检查它是否为&#34;。&#34;在其中(并且可能添加一个布尔值来检查是否只有一个&#34;。&#34;?)。

它看起来像这样:

bool MyThread::is_number(const string& data)
{
    string::const_iterator it = data.begin();
    while (it != data.end())
    {
        if (std::isdigit(*it) || it == "."){
          ++it;
        }

    }
    return !data.empty() && it == data.end();
}

答案 1 :(得分:0)

如果已经满足点和数字,您可以添加布尔标志并修改循环:

bool MyThread::is_number(const string& data)
{
    bool dot_met = false, digit_met = false;
    for( string::const_iterator it = data.begin(); it != data.end(); ++it )
    {
        if( is_digit( *it ) ) {
            digit_met = true;
            continue;
        }
        if( *it == '.' ) {
           if( !digit_met || dot_met ) return false;
           dot_met = true;
           continue;
        }
        return false;
    }
    return digit_met;
}

此表单中的函数不接受以#开头的数字。 (如.05)如果你真的想要,变化是微不足道的。或者,您可以使用带有"\\d+\\.?\\d*"表达式的regual表达式库。