【问题标题】:How can I convert from qi::double_ to string?如何从 qt::double 转换为字符串?
【发布时间】:2015-12-21 14:28:14
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    使用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 不会产生文字输入,因此它可能无法忠实地为您的目的往返。

    【讨论】:

    【解决方案2】:

    如果您的问题只是:

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

    那么是的,您可以使用to_string 将任何数字转换回string

    【讨论】:

    • 这并没有真正在上下文中回答问题,因为我敢打赌,您无法在 Qi 语法规则中展示如何使用 to_string
    • @sehe 我将“double_ 的结果@ 到string”这句话理解为他已经将值提取到变量中。但是我给了你一个 +1,因为你是对的,直接在语法中这样做可以大大简化问题。
    • 刚刚完成了一个示例,该示例还显示了std::to_string 实际上可以如何使用(尽管这样做可能会丢失输入中的一些信息,因为表示将是std::to_string 选择的任何内容,而不是实际输入)。
    • @sehe 很好,我想再给你一个 +1,但你已经得到了我的 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-13
    • 2011-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-09
    • 1970-01-01
    相关资源
    最近更新 更多