正在分析未知类型的数字字符串
Parsing numeric strings of unknown type?
当目标类型事先未知时,在C++中将std::string
解析为某个数字类型的最佳方法是什么?
我已经看过lexical_cast,但它将目标类型作为模板参数。我可以编写包装器函数,通过捕获bad_lexical_cast
并返回false
来滥用这一点,但这看起来很难看。
我的输入值通常是int
或float
,并且具有非常简单的格式,但灵活的东西会很棒!
您可以使用Boost Spirit Numerical Parsers或(ab)使用Boost Lexicalcast。
Boost Spirit允许您对接受的格式进行细粒度控制,例如参见
- RealPolicies
这里有一个快速演示,还展示了如何检测几种可能的数字输入格式(渐进)并返回匹配的类型。当然,这可能有些过头了,但它应该展示如何进一步使用Spirit。
演示还展示了如何推进输入迭代器,以便您可以轻松地继续解析数字输入的结束位置。
#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>
namespace qi = boost::spirit::qi;
enum numeric_types
{
fmt_none,
fmt_float,
fmt_double,
fmt_uint,
fmt_int,
// fmt_hex, etc.
};
template <typename It>
bool is_numeric(It& f, It l, numeric_types& detected)
{
return qi::phrase_parse(f,l,
qi::uint_ [ qi::_val = fmt_uint ]
| qi::int_ [ qi::_val = fmt_int ]
| qi::float_ [ qi::_val = fmt_float ]
| qi::double_ [ qi::_val = fmt_double ]
,qi::space, detected);
}
template <typename It>
bool is_numeric(It& f, It l)
{
numeric_types detected = fmt_none;
return is_numeric(f, l, detected);
}
int main()
{
const std::string input = "124, -25, 582";
std::string::const_iterator it = input.begin();
bool ok = is_numeric(it, input.end());
if (ok)
{
std::cout << "parse successn";
if (it!=input.end())
std::cerr << "trailing unparsed: '" << std::string(it,input.end()) << "'n";
}
else
std::cerr << "parse failed: '" << std::string(it,input.end()) << "'n";
return ok? 0 : 255;
}
当您实际解析数据进行转换时,您需要知道将结果放入其中的类型;C++是一种静态类型语言,这是没有办法的。如果你有一个字符串,并且想知道它是什么类型的,使用正则表达式是一个简单的解决方案:
"\s*[+-]?(?:"
"\d+\.\d*(?:[Ee][+-]?\d+)?"
"|\.\d+(?:[Ee][+-]?\d+)?"
"|\d+[Ee][+-]?\d+"
")"
应匹配任何可能的浮点值,并且:
"\s*[+-]?(?:"
"[1-9][0-9]*"
"|0[0-7]*"
"|0x[0-9a-fA-F]+"
)"
匹配任意基数的整数。(假设Boost或C++11正则表达式的默认配置。)
相关文章:
- 如何在 getline 中删除/忽略超过特定数字的字符?
- 不反转数字的字符反转
- 如果是数字或字符,请检查输入
- 编写一个程序,输入整数 n 并打印该数字的字符数(符号除外)
- 识别数字的字符
- 遍历 std::string 时如何获取没有数字的字符?
- 2命令行参数中的数字数字仅被视为一个数字
- 如何验证输入仅是数字数字
- 为什么 cin.fail() 在输入数字后跟字符时不返回 false?
- 测试字符串是数字还是字符
- 如果字符串中没有空格,如何解析带有数字和字符的字符串并分隔数字和字符
- RSA数字和字符值算法
- 正则表达式:仅限数字 + 字母数字 + 特殊字符
- 检查字符串的每个元素中的数字或字符
- 调用函数时,是否可以在被调用函数的名称后面附加一个数字或字符
- c++ cin.ignore忽略空格、数字和字符来测试回文
- 读入后面跟着数字的字符
- 使用数字和字符操作符创建表达式
- c++计数数字和字符
- 我的程序应该摆脱不是数字的字符,但不能完全工作,关于我做错了什么有什么想法吗?