我在尝试编写一个检查字符串是否是数字的函数时遇到了不少麻烦。对于我正在编写的游戏,我只需要检查我正在读取的文件中的一行是否是一个数字(这样我就可以知道它是否是一个参数)。我写了下面的函数,我认为它工作得很顺利(或者我不小心编辑了来阻止它,或者我是精神分裂的人,或者Windows是精神分裂的人):
bool isParam (string line)
{
if (isdigit(atoi(line.c_str())))
return true;
return false;
}
发布于 2011-01-11 14:08:44
最有效的方法是遍历字符串,直到找到一个非数字字符。如果有任何非数字字符,您可以认为该字符串不是数字。
bool is_number(const std::string& s)
{
std::string::const_iterator it = s.begin();
while (it != s.end() && std::isdigit(*it)) ++it;
return !s.empty() && it == s.end();
}
或者如果你想用C++11的方式来做:
bool is_number(const std::string& s)
{
return !s.empty() && std::find_if(s.begin(),
s.end(), [](unsigned char c) { return !std::isdigit(c); }) == s.end();
}
正如下面的注释所指出的,这只适用于正整数。如果您需要检测负整数或分数,则应该使用更健壮的基于库的解决方案。不过,添加对负整数的支持是相当微不足道的。
发布于 2013-05-16 05:10:28
为什么要重新发明轮子呢?C标准库(也可以在C++中使用)有一个函数可以做到这一点:
char* p;
long converted = strtol(s, &p, 10);
if (*p) {
// conversion failed because the input wasn't a number
}
else {
// use converted
}
如果您想处理分数或科学记数法,请改用strtod
(您将得到double
结果)。
如果您想在C/C++风格("0xABC"
)中允许十六进制和八进制常量,那么将最后一个参数改为0
。
然后,您的函数可以编写为
bool isParam(string line)
{
char* p;
strtol(line.c_str(), &p, 10);
return *p == 0;
}
发布于 2013-08-01 00:38:48
使用C++11编译器,对于非负整数,我会使用如下代码(注意::
而不是std::
):
bool is_number(const std::string &s) {
return !s.empty() && std::all_of(s.begin(), s.end(), ::isdigit);
}
http://ideone.com/OjVJWh
https://stackoverflow.com/questions/4654636
复制相似问题