简介(来自Eric Lippert博客) :
不幸的例外是不幸的设计决定的结果。 令人烦恼的例外情况完全不同寻常 环境,因此必须始终抓住并处理。
一个令人烦恼的异常的典型例子是Int32.Parse,它抛出 如果你给它一个无法解析为整数的字符串。但是 此方法的99%用例正在转换由字符串输入的字符串 用户,可能是任何旧东西,因此绝不是 解析失败的特殊情况。更糟糕的是,没有办法 调用者提前确定他们的论点是否不好 没有实现整个方法本身,在这种情况下他们 不需要首先调用它。
现在重要的部分:
这个不幸的设计决定当然令人烦恼 框架团队此后不久实施了TryParse 对的。
来自MSDN Int32.TryParse:
返回值类型:System.Boolean如果转换了s,则为true 成功;否则,错误。
所以同事们正在研究一些需要检查一个字符串是否为数字的代码,所以在考虑它并意识到没有好的C ++解决方案之后(基本上它是for__each / find_if或boost:lexical_cast try catch我觉得有is_convertible
或者来自boost的东西会有多好?
Ofc我可以包装boost lexical_cast
并在try块结束时返回true并在catch块结束时返回false但我更喜欢现有的实践:)解决方案。
答案 0 :(得分:3)
>因此,同事们正在研究一些需要检查字符串是否为数字的代码,因此在考虑它并意识到没有好的C ++解决方案之后
在C ++ 11中,您有std::stol
和/或std::stod
,这可能会满足您的需求。
更新
如果您不想使用例外,那么strtol(str, &endp)
将进行转换。
您可以在通话后检查str == endp
是否有效;如果它们是相同的,则不可能进行转换(因为endp将指向字符串未转换部分的开头)
像这样:
strtol(str, &endp);
if (endp==str) { /* no conversion occurred */ }
答案 1 :(得分:1)
如果你可以使用提升,那么你可以使用boost::conversion::try_lexical_convert
:
#include <boost/lexical_cast/try_lexical_convert.hpp>
std::string str("1.2");
double res;
if(boost::conversion::try_lexical_convert<double>(str, res)){
//everything normal
}
else{
//we got a problem
}
答案 2 :(得分:0)
不是说实话,据我所知,没有try_lexical_cast
,但你可以做两件事。
自己使用流和测试提取成功,而不是在大多数情况下lexical_cast
无论如何都在内部使用流:
std::string str="56.7";
std::istringstream ss(str);
double d;
if(ss >> d) {
//passed
}
else //failed
当然,如你所说,你可以包裹lexical_cast