如何将带有前导零的数字字符串转储为 yaml-cpp 中的有效 yaml 字符串?

Posted

技术标签:

【中文标题】如何将带有前导零的数字字符串转储为 yaml-cpp 中的有效 yaml 字符串?【英文标题】:How to dump a digit string with leading zeros, as a valid yaml string in yaml-cpp? 【发布时间】:2019-02-22 05:28:28 【问题描述】:

创建带有前导零的 yaml 字符串不会在 yaml-cpp 中使用引号进行转义。因此,将字符串写入 texfile 不是有效的 yaml-string。leading_zeros: 00005 根据 yaml 1.2 规范为 5(自己尝试:http://www.yamllint.com/)

YAML::Node node;
node["leading_zeros"] = "00005";
std::cout << YAML::Dump(node)<<std::endl;
// output: leading_zeros: 00005
// instead of:leading_zeros: "00005"

如何让 yaml-cpp 转义带有前导零的字符串?那么这不会被其他 yaml 解析器解释为整数吗?

手动转义似乎不是正确答案。

node["leading_zeros"] = "\"00005\"";

更新: 数字值存储在 YAML::Node 中!我很确定这是一个错误。

【问题讨论】:

【参考方案1】:

花了一些时间分析代码后,我找到了这个 hacky 解决方案:https://github.com/nikich340/yaml-cpp/commit/468e0832b39c8320faa7c925708b76f6a3b1b840 它将在所有最初是带引号的字符串的标量周围保存双引号(或者您可以将 emitte manip 更改为单引号)。

【讨论】:

【参考方案2】:

直接使用YAML::Emitter

YAML::Emitter out;
out << YAML::BeginMap;
out << YAML::Key << "leading_zeroes" << YAML::Value;
out << YAML::Value << YAML::DoubleQuoted << "00005";
out << YAML::EndMap;

【讨论】:

这不是一个有用的现实生活解决方案。 yaml-cpp 的 YAML::Node 已经在我们的 SW 中使用。因此,除了数字字符串之外,同一节点中的所有其他值都不应该用引号引起来。我很确定这是 yaml-cpp 中的错误。请在任何可用的验证器中尝试一下:00005 不是 yaml 中的字符串。

以上是关于如何将带有前导零的数字字符串转储为 yaml-cpp 中的有效 yaml 字符串?的主要内容,如果未能解决你的问题,请参考以下文章

如何在java中获取带有前导零的整数中的位数?

Excel:如何像数据透视表一样对一系列带有前导零的数字进行排序?

使用vba在excel中复制带有前导零的数字文本

如何格式化带有前导零的Java字符串?

在 Rust 中将二进制字符串转换为带有前导零的十六进制字符串

格式字符串,带前导零的整数