如何将qi::double_转换为string

How can I convert from qi::double_ to string?

本文关键字:转换 string double qi      更新时间:2023-10-16

我使用spiri::qi来解析文本,并将我解析的内容推送到vector<string>,在大多数情况下,这很好,因为它们大多是名称和地址,但也有一些数字我使用double_来解析,但一旦我将其推送到vector,它就会认为它是一个字符代码,就像'x3'代替3.0一样。我不想使用variant,因为它对于少数情况来说工作量太大。在推送之前,我是否可以将double_的结果转换为string

使用raw[double_](更确切地说是as_string[raw[double_]])。

第一个与任何与字符容器具有属性兼容性的规则类似。后者原子性地公开了一个std::string(对于std::wstring也有一个)。

奖金

要完成Jonathan Mee关于"只使用语言"(转述…:)的建议,可以,请参阅下面的最后一个演示语法:

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

如果您的问题只是:

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

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