我是C ++,boost等人的新手。
我想知道在boost或STL中是否已经有一个函数可以用来确定字符串是否为数字。
数字字符串可能如下所示: 100
或
100.52
我知道有很多例子如何编写这样的函数,但我想知道是否已经有一个我可以使用的函数。
我正在寻找纯粹的C ++ - 解决方案,而不是C。
[UPDATE: 我已经在使用lexical_cast转换我的字符串了,我只是想知道是否有像is_numeric这样的方法可以用于此...]
答案 0 :(得分:10)
不,没有现成的方法可以直接这样做。
您可以使用boost::lexical_cast<double>(your_string)
,如果它抛出异常,那么您的字符串不是双倍。
bool is_a_number = false;
try
{
lexical_cast<double>(your_string);
is_a_number = true;
}
catch(bad_lexical_cast &)
{
// if it throws, it's not a number.
}
答案 1 :(得分:8)
boost::regex
(或std::regex
,如果你有C ++ 0x);
你可以定义你想接受的内容(例如在你的上下文中,
“0x12E”是一个数字还是没有?)。对于C ++整数:
"\\s*[+-]?([1-9][0-9]*|0[0-7]*|0[xX][0-9a-fA-F]+)"
对于C ++浮点:
"\\s*[+-]?([0-9]+\\.[0-9]*([Ee][+-]?[0-9]+)?|\\.[0-9]+([Ee][+-]?[0-9]+)?|[0-9]+[Ee][+-]?[0-9]+)"
但是根据你正在做的事情,你可能不需要 支持复杂的事情。你引用的两个例子就是
涵盖"[0-9]+(\\.[0-9]*)?"
例如。
如果您稍后需要数值,也可能是
同样容易将字符串转换为istringstream
,和
立即做转换。如果没有错误,那么你
提取所有字符,字符串是一个数字;如果不,
事实并非如此。这样可以减少对精确控制的控制
但是,你要接受的格式。
答案 2 :(得分:6)
如果完全关注性能,我会使用boost。spirit。qi而不是std::stringstream
:
#include <string>
#include <boost/spirit/include/qi_parse.hpp>
#include <boost/spirit/include/qi_numeric.hpp>
bool is_numeric(std::string const& str)
{
std::string::const_iterator first(str.begin()), last(str.end());
return boost::spirit::qi::parse(first, last, boost::spirit::double_)
&& first == last;
}
如果要允许尾随空格,请执行以下操作:
#include <string>
#include <boost/spirit/include/qi_parse.hpp>
#include <boost/spirit/include/qi_numeric.hpp>
#include <boost/spirit/include/qi_char_class.hpp>
#include <boost/spirit/include/qi_operator.hpp>
bool is_numeric(std::string const& str)
{
std::string::const_iterator first(str.begin()), last(str.end());
return boost::spirit::qi::parse(first, last,
boost::spirit::double_ >> *boost::spirit::qi::space)
&& first == last;
}
答案 3 :(得分:3)
如果转换“占用”原始字符串中的所有字符(= stringstream
),请使用true
并返回eof()
。
bool is_numeric(const std::string& str) {
std::stringstream conv;
double tmp;
conv << str;
conv >> tmp;
return conv.eof();
}
答案 4 :(得分:3)
bool is_numeric(std::string number)
{
char* end = 0;
std::strtod(number.c_str(), &end);
return end != 0 && *end == 0;
}
bool is_integer(std::string number)
{
return is_numeric(number.c_str()) && std::strchr(number.c_str(), '.') == 0;
}
答案 5 :(得分:2)
您可以在字符串上尝试lexical_cast。
答案 6 :(得分:1)
以下代码
以下语句,如果“ str”仅由0〜9组成,则返回true,否则返回false。
返回str.find_first_not_of(“ 0123456789”)== std :: string :: npos
答案 7 :(得分:1)
从C ++ 11开始,您可以简单地使用std::stof
,std::stod
,std::stold
中的一个转换为float
,double
和{{1 }}, 分别。如果有问题,它们会将字符串转换为数值或引发异常(请参见the reference)。这是long double
的示例:
std::stod
答案 8 :(得分:0)
不需要助推器,只需stl ... 可以将单个字符检查为int类型(c> ='0'&& c <='9'),find_if_not将查找第一个不符合[first]和[last]条件的字符。如果没有找到匹配项,它将返回[last]。
如果应检查其他字符,例如空格,-,将其添加。
#include <string>
#include <algorithm>
bool isNumeric(std::string strValue)
{
if (strValue.empty())
return false;
else
return (std::find_if_not( std::begin(strValue)
, std::end(strValue)
, [](char c)
{ return (c >= '0' && c <= '9'); }
) == std::end(strValue)
);
}
P.S。 @Jian Hu是一个空字符串数字吗?