另一个版本...
使用strtol
,将其包装在一个简单的函数中以隐藏其复杂性:
inline bool isInteger(const std::string & s)
{
if(s.empty() || ((!isdigit(s[0])) && (s[0] != '-') && (s[0] != '+'))) return false;
char * p;
strtol(s.c_str(), &p, 10);
return (*p == 0);
}
为什么使用 strtol
?
虽然我非常喜欢 C++,但有时候在我看来 C API 是最好的选择:
- 对于一个可能失败的测试来说,使用异常处理是过度了。
- 当 C 标准库有一个专门的函数可以胜任工作时,使用 lexical cast 创建临时流对象是过度和低效的。
它是如何工作的?
strtol
乍一看似乎相当原始,因此解释后代码更容易阅读:
strtol
将解析字符串,停在第一个不能被视为整数的字符处。如果你提供了 p
(就像我上面做的那样),它会将 p
设置在这个第一个非整数字符的位置。
我的想法是,如果 p
没有被设置为字符串的结尾(0 字符),那么该字符串中存在非整数字符,这意味着该字符串不是一个正确的整数。
第一个测试是用来排除特殊情况的(前导空格、空字符串等)。
当然,这个函数应该根据你的需求进行定制(前导空格是错误吗?等等)。
来源:
请参阅 strtol
的描述:http://en.cppreference.com/w/cpp/string/byte/strtol。
也可以查看 strtol
的姐妹函数(strtod
、strtoul
等)的描述。