从std :: string转换为bool

时间:2010-01-29 23:19:47

标签: c++ string boolean

将std :: string转换为bool的最佳方法是什么?我正在调用一个返回“0”或“1”的函数,我需要一个干净的解决方案来将其转换为布尔值。

14 个答案:

答案 0 :(得分:80)

我很惊讶没人提到这个:

bool b;
istringstream("1") >> b;

bool b;
istringstream("true") >> std::boolalpha >> b;

答案 1 :(得分:44)

bool to_bool(std::string const& s) {
     return s != "0";
}

答案 2 :(得分:32)

这对你来说可能有些过分,但我会使用boost::lexical_cast

boost::lexical_cast<bool>("1") // returns true
boost::lexical_cast<bool>("0") // returns false

答案 3 :(得分:12)

您是否关心返回值无效的可能性,或者您不关心。到目前为止,大多数答案处于中间位置,除了“0”和“1”之外还有一些字符串,或许可以理解它们应该如何转换,也许会引发异常。 无效输入无法生成有效输出,您不应尝试接受它。

如果您不关心无效退货,请使用s[0] == '1'。它非常简单明了。如果你必须证明它对某人的容忍度,说它将无效输入转换为false,并且空字符串可能是STL实现中的单个\0,因此它相当稳定。 s == "1"也很好,但s != "0"对我来说似乎很迟钝而且无效=&gt;真。

如果您确实关心错误(可能应该),请使用

if ( s.size() != 1
 || s[0] < '0' || s[0] > '1' ) throw input_exception();
b = ( s[0] == '1' );

这会捕获所有错误,对于任何知道C的smidgen的人来说,这也是非常明显和简单的,并且没有什么会更快地执行。

答案 4 :(得分:6)

c ++ 11中还有std :: stoi:

bool value = std :: stoi(someString.c_str());

答案 5 :(得分:2)

写一个免费功能:

bool ToBool( const std::string & s ) {
   return s.at(0) == '1';
}

这是最简单的事情,但你需要问问自己:

  • 空字符串应该返回什么?上面的版本抛出异常
  • “1”或“0”以外的字符应该转换为什么?
  • 是一个多个字符的字符串,是函数的有效输入吗?

我确信还有其他人 - 这是API设计的乐趣!

答案 6 :(得分:2)

我会使用它,它会做你想要的,并捕获错误案例。

bool to_bool(const std::string& x) {
  assert(x == "0" || x == "1");
  return x == "1";
}

答案 7 :(得分:1)

我会改变首先返回此字符串的丑陋函数。这就是布尔所用的。

答案 8 :(得分:0)

试试这个:

bool value;

if(string == "1")
    value = true;
else if(string == "0")
    value = false;

答案 9 :(得分:0)

bool to_bool(std::string const &string) { 
    return string[0] == '1';
}

答案 10 :(得分:0)

这是一种类似于Kyle的方式,除了它处理前导零和东西:

bool to_bool(std::string const& s) {
     return atoi(s.c_str());
}

答案 11 :(得分:0)

您始终可以将返回的字符串包装在处理布尔字符串概念的类中:

class BoolString : public string
{
public:
    BoolString(string const &s)
    :   string(s)
    {
        if (s != "0" && s != "1")
        {
            throw invalid_argument(s);
        }
    }

    operator bool()
    {
        return *this == "1";
    }
}

请拨打以下内容:

BoolString bs(func_that_returns_string());
if (bs) ...;
else ...;

如果违反了invalid_argument"0"的规则,那将会抛出"1"

答案 12 :(得分:0)

DavidL's answer是最好的,但我发现自己想同时支持两种形式的布尔输入。因此,主题有一个较小的变化(以std::stoi命名):

bool stob(std::string s, bool throw_on_error = true)
{
    auto result = false;    // failure to assert is false

    std::istringstream is(s);
    // first try simple integer conversion
    is >> result;

    if (is.fail())
    {
        // simple integer failed; try boolean
        is.clear();
        is >> std::boolalpha >> result;
    }

    if (is.fail() && throw_on_error)
    {
        throw std::invalid_argument(s.append(" is not convertable to bool"));
    }

    return result;
}

这支持“ 0”,“ 1”,“ true”和“ false”作为有效输入。不幸的是,我想不出一种可移植的方式来同时支持“ TRUE”和“ FALSE”

答案 13 :(得分:0)

如果需要“ true”和“ false”字符串支持,请考虑使用Boost ...

BOOST_TEST(convert<bool>( "true", cnv(std::boolalpha)).value_or(false) ==  true);
BOOST_TEST(convert<bool>("false", cnv(std::boolalpha)).value_or( true) == false);

BOOST_TEST(convert<bool>("1", cnv(std::noboolalpha)).value_or(false) ==  true);
BOOST_TEST(convert<bool>("0", cnv(std::noboolalpha)).value_or( true) == false);

https://www.boost.org/doc/libs/1_71_0/libs/convert/doc/html/boost_convert/converters_detail/stream_converter.html