我可以判断一个std :: string是否使用stringstream表示一个数字?

ala*_*ere 8 c++ numbers words stringstream

显然,这可以用于显示字符串是否为数字,例如"12.5"== yes,"abc"== no.但是我得到了一个没有注意的输入.

std::stringstream ss("2");
double d; ss >> d;
if(ss.good()) {std::cout<<"number"<<std::endl;}
else {std::cout<<"other"<<std::endl;}
Run Code Online (Sandbox Code Playgroud)

Fre*_*urk 7

不要用good()!测试流是否失败:

if (ss)
Run Code Online (Sandbox Code Playgroud)

Good告诉你是否设置了eofbit,badbit或failbit,而fail()告诉你badbit和failbit.除非你已经知道流失败了,否则你几乎从不关心eofbit ,所以你几乎不想使用好的.

请注意,如上所述,直接测试流完全等同于:

if (!ss.fail())
Run Code Online (Sandbox Code Playgroud)

相反,!ss相当于ss.fail().


将提取结合到条件表达式中:

if (ss >> d) {/*...*/}
Run Code Online (Sandbox Code Playgroud)

完全等同于:

ss >> d;
if (ss) {/*...*/}
Run Code Online (Sandbox Code Playgroud)

但是,您可能希望测试是否可以将完整的字符串转换为double,这更复杂一些.使用boost :: lexical_cast已经处理了所有情况.


Qua*_*key 6

如果要检查a是否string包含一个数字而不包含任何其他内容(除了空格),请使用以下命令:

#include <sstream>

bool is_numeric (const std::string& str) {
    std::istringstream ss(str);
    double dbl;
    ss >> dbl;      // try to read the number
    ss >> std::ws;  // eat whitespace after number

    if (!ss.fail() && ss.eof()) {
        return true;  // is-a-number
    } else {
        return false; // not-a-number
    }
}
Run Code Online (Sandbox Code Playgroud)

ss >> std::ws是用于接受数字与结尾的空白如重要"24 ".

ss.eof()检查是拒绝串一样重要"24 abc".它确保我们在读取数字(和空格)后到达字符串的末尾.

测试工具:

#include <iostream>
#include <iomanip>

int main()
{
    std::string tests[8] = {
            "", "XYZ", "a26", "3.3a", "42 a", "764", " 132.0", "930 "
    };
    std::string is_a[2] = { "not a number", "is a number" };
    for (size_t i = 0; i < sizeof(tests)/sizeof(std::string); ++i) {
        std::cout << std::setw(8) << "'" + tests[i] + "'" << ": ";
        std::cout << is_a [is_numeric (tests[i])] << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

输出:

      '': not a number
   'XYZ': not a number
   'a26': not a number
  '3.3a': not a number
  '42 a': not a number
   '764': is a number
' 132.0': is a number
  '930 ': is a number
Run Code Online (Sandbox Code Playgroud)


Mar*_*k B 5

您应该使用 anistringstream以便它知道它正在尝试解析输入。另外,只需直接检查提取的结果,而不是good稍后使用。

#include <sstream>
#include <iostream>

int main()
{
    std::istringstream ss("2");
    double d = 0.0;
    if(ss >> d) {std::cout<<"number"<<std::endl;}
    else {std::cout<<"other"<<std::endl;}
}
Run Code Online (Sandbox Code Playgroud)