如何确定字符串中是否包含非数字?
How do I determine whether a string has non-numbers in it?
我正在创建一个名为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
成功和价值本身
相关文章:
- std::stoi 的版本拒绝任何非数字
- CIN 仅在输入非数字值时跳过下一个 CIN
- CMake 包含非 cmake 库的第三方标头
- C++ 从 std::string 中删除所有非数字字符
- 在 std::unordered_set <double>中插入多个非数字
- 非数字输入检查
- C++将包含非人类可读数据的字符串转换为 200 双精度
- 如何从 cin 读取直到输入非数字内容?
- 将非数字字符串存储为二进制整数
- 检测<T>某些非数字类型 T 的 std::numeric::type 的特化
- 使用递归擦除字符串上的所有非数字
- 如何复制包含非原始类型的阵列
- 如何为字符串编写正则表达式,其中包含一个数字至少一个数字,并且不包含任何字母
- 如果QString包含一个数字
- 用于计算不包含给定数字的第n个数字的程序
- 我想将指向 const 对象的指针放入包含非 const 指针的容器中.我有什么选择
- 如何在包含不同数字的范围内找到整数
- 循环直到整数输入在所需范围内无法处理非数字字符输入
- 将NetBeans配置为调试包含非标准库的C 程序
- 如何确定字符串中是否包含非数字?