我正在创建一个名为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;
如果我先转换它,检查非数字会更容易吗?
答案 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
成功和价值本身。