如何将qi::double_转换为string
How can I convert from qi::double_ to string?
我使用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
。
相关文章:
- 使用char类型将decimal转换为string,将string转换为decimal
- C++:如何将 unix 时间的字符串转换为 *tm?(使用时间错误:"cannot convert 'String' to 'tm*' ")
- 将C++ std::string 转换为 UTF-16-LE 编码的字符串
- 将日语 wstring 转换为 std::string
- 如何将带有十六进制值的 std::string 转换为 std::vector<无符号字符>
- 如何在 std::string 和 Aws::String 之间进行转换?
- C++:将模板类型 char 转换为 std::string
- 无法<string>从"常量字符 []"转换为<类名>
- 将 std::string( "x3BxDEx7C" ) 转换为可读的十六进制字符串?
- 如何在 c++ 中将向量转换为<string>常量字符* const*?
- 无法从'const std::string [3]'转换为'std::string'
- 从 std::string 转换为 const 无符号整数
- 使用 .data() 将字符数组转换为 std::string 不会转换整个数组
- 为什么std::string没有(显式)const char*强制转换
- 将单个字符转换为 std::string 前缀 \x01
- C++ 模板函数无法将"std:string"转换为"double"作为回报
- 将 std::string 转换为 const char* 用于 printf 消耗
- Swig无法将python3的字节对象转换为std::string
- 将utf16宽std::wstring转换为utf8窄std::string以获得罕见字符时出现问题
- 将 std::string 转换为 const tchar*