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

How do I determine whether a string has non-numbers in it?

本文关键字:包含非 数字 是否 何确定 字符串      更新时间:2023-10-16

我正在创建一个名为Double的类,可以将字符串转换为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() << "nn";
}

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

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

strsteam ss;
string str = "123.45";
double d;
ss << str;
ss >> d;
return d;

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

听起来你想确保整个字符串转换为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 ) {

要做正确的错误检查,您可以检查ss >> d的结果:

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

有关详细的讨论和完整的/泛型转换代码,请参见:

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

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

使用该链接上提供的代码,在任何一点上都一样容易。你必须在某个地方进行转换,而转换代码就是你应该放置错误检查的地方。

至于,在放置转换代码的地方,这是一个平衡干净的类设计与代码的预期使用的问题。如果构造函数被调用了很多次,并且大多数用户都有一个字符串(而不是双精度类型),那么您可能会考虑将类弄脏,并将转换代码放在备用构造函数中。否则,让类去考虑它的设计目的,并将转换代码与类分开。看到:
  • http://en.wikipedia.org/wiki/Single_responsibility_principle
  • http://en.wikipedia.org/wiki/Separation_of_concerns

使用strtod。这个函数会将一个(c风格的)字符串转换为双精度类型,并且会告诉你在转换中使用了多少字符串(这样你就可以检查确保整个字符串是一个有效的数字并且被解析了)。

一个好处是它可能比使用流更快(试试吧!)。

我会使用一些简单且经过时间验证的方法:

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

它将给你true成功和价值本身