繁体   English   中英

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

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

我正在创建一个名为Double的类,该类可以将字符串转换为双精度型,并将双精度型转换为字符串。 我需要一些方法来检查以确保当用户输入字符串时,字符串中没有不是数字的任何内容。 某种布尔函数,如果字符串是全数字,则返回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;

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

听起来您想确保将整个字符串转换为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#faq-39.2

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

有了该链接上提供的代码,任何时候它都将一样容易。 您将必须在某处进行转换,而转换代码是您应该进行错误检查的地方。

至于将转换代码放置在何处 ,则需要在干净的类设计与代码的预期用法之间取得平衡。 如果构造函数被调用很多,并且大多数用户有一个字符串(而不是双精度),那么您可能会考虑弄脏该类并将转换代码放入备用构造函数中。 否则,让类担心它的设计目的,然后将转换代码与类分开。 看到:

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

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

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

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

它将为您带来成功和价值本身的true

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM