如何确定字符串中是否包含非数字?

时间:2011-04-24 22:59:22

标签: c++ string parsing double

我正在创建一个名为Double的类,它可以将字符串转换为双精度数并将双精度数转换为字符串。我需要一些方法来检查以确保当用户输入字符串时,字符串没有任何不是数字的东西。某种bool函数,如果字符串是全部数字,则返回false;如果字符串中包含非数字,则返回true。到目前为止我已经

string test;
double d;

cout << "Enter a string: ";
cin >> test;

if(isNAN(test)) //isNAN (is Not A Number)
    cout << "Your entry cannot be converted";
else
{
    Double d1(test); //overloaded constructor takes a string
    cout << "Your string as a double is: " << d1.toDouble() << "\n\n";
}

我正在考虑制作一个循环来运行字符串并测试每个字符,但这似乎有很多工作要做。是否有某种简单的函数可以确定字符串的任何部分是否不是数字?

另外,我正在使用strstream转换它,有点像这样:

strsteam ss;
string str = "123.45";
double d;

ss << str;
ss >> d;

return d;

如果我先转换它,检查非数字会更容易吗?

4 个答案:

答案 0 :(得分:3)

听起来你想确保整个字符串转换为double,即转换后没有输入。验证这一点的简单方法是eof()

std::istringstream ss( str.c_str() );
ss >> d;

// ss >> std::ws; if you want to ignore trailing whitespace

if ( ss && ss.eof() ) {
    return d; // successful conversion
} else {
    // input left over
}

对于懒惰,这可以写成一行:

double d;
if ( ( istringstream( str.c_str() ) >> d >> ws ).rdstate() == ios::eofbit ) {

答案 1 :(得分:2)

要进行正确的错误检查,您可以检查ss >> d

的结果
if (!(ss >> d))
{
    // conversion was unsuccessful...
}

有关详细讨论和完整/通用转换代码,请参阅:

http://www.parashift.com/c++-faq-lite/misc-technical-issues.html#faq-39.2

  

如果我先转换它,检查非数字会更容易吗?

使用该链接提供的代码,在任何一点都可以轻松实现。您将不得不在某处进行转换,转换代码是您应该进行错误检查的地方。

对于放置转换代码的 where ,这是一个平衡干净的类设计与代码的预期用法的问题。如果构造函数被调用很多,并且大多数用户都有一个字符串(不是双精度),那么您可能会考虑弄脏类并将转换代码放在备用构造函数中。否则,让课程担心它的设计目的,并将转换代码与类分开。参见:

答案 2 :(得分:1)

使用strtod。此函数会将(C风格)字符串转换为double,并告诉您转换中使用了多少字符串(因此您可以检查以确保整个字符串是有效数字并已解析)

奖金是它可能比使用流更快(试试吧!)。

答案 3 :(得分:0)

我会使用简单且经过时间验证的东西:

bool str2f(const char* str, double& d)
{
  return sscanf(str,"%e", &d) == 1;
}

它将为您提供true成功和价值本身。