如何从qi :: double_转换为字符串?

时间:2015-12-21 14:28:14

标签: c++ parsing boost type-conversion boost-spirit-qi

我正在使用spiri::qi来解析文本并将我解析的内容推送到vector<string>,因为它们大部分是名称和地址,但大多数情况下它都很好,但也有一些数字我我正在使用double_进行解析,但是一旦我将其推送到vector,它就会将其视为字符代码,例如'\x3'代替3.0。我不想使用variant因为它只为少数情况做了太多工作。无论如何我可以在推送之前将double_的结果转换为string吗?

2 个答案:

答案 0 :(得分:3)

使用raw[double_](甚至更准确地as_string[raw[double_]])。

第一个像任何属性与字符容器兼容的规则一样工作。后者以原子方式公开std::stringstd::wstring也有一个)。

<强>奖金

要完成Jonathan Mee的建议“只使用语言”(释义...... :))你可以,请参阅下面的最后一个演示语法:

<强> Live On Coliru

#include <boost/spirit/include/qi.hpp>
#include <boost/spirit/include/phoenix.hpp>

namespace qi = boost::spirit::qi;
namespace px = boost::phoenix;

int main() {

    using It = std::string::const_iterator;
    auto to_string_f = [](auto v) { return std::to_string(v); };
    px::function<decltype(to_string_f)> to_string_ { to_string_f };

    for (std::string const input : { "3.14", "+inf", "NaN", "-INF", "99e-3" })
    {
        for (auto const& grammar : std::vector<qi::rule<It, std::string()>> {
                //qi::double_,  // results in strange binary interpretations, indeed
                qi::raw[ qi::double_ ], 
                qi::as_string [ qi::raw[ qi::double_ ] ], 
                qi::double_ [ qi::_val = to_string_(qi::_1) ], 
            })
        {
            auto f = input.begin(), l = input.end();
            std::string result;
            if (qi::parse(f, l, grammar, result))
                std::cout << input << "\t->\t" << result << "\n";
            else
                std::cout << "FAILED for '" << input << "'\n";
        }
    }
}

打印

3.14    ->  3.14
3.14    ->  3.14
3.14    ->  3.140000
+inf    ->  +inf
+inf    ->  +inf
+inf    ->  inf
NaN ->  NaN
NaN ->  NaN
NaN ->  nan
-INF    ->  -INF
-INF    ->  -INF
-INF    ->  -inf
99e-3   ->  99e-3
99e-3   ->  99e-3
99e-3   ->  0.099000

请注意,std::to_string不会导致文字输入,因此可能不会为您的目的忠实地往返。

答案 1 :(得分:0)

如果你的问题只是:

  

无论如何,我可以在推送之前将double_的结果转换为string吗?

然后是的,您可以使用to_string将任意号码转换回string