使用 fmtlib,当值为负时,零填充数值更短,我可以调整这种行为吗?
Posted
技术标签:
【中文标题】使用 fmtlib,当值为负时,零填充数值更短,我可以调整这种行为吗?【英文标题】:Using fmtlib, zero padded numerical value are shorter when the value is negative, can I adapt this behaviour? 【发布时间】:2021-01-26 01:28:03 【问题描述】:我正在使用fmtlib 来格式化字符串和数值,但我遇到了负整数的问题。 当我用零填充该值时,无论值的符号如何,我都希望零个数一致。
例如,使用 4 的填充,我想要以下内容:
2 作为“0002”返回 -2 将返回为“-0002”fmtlib 的默认行为是将前缀长度(即符号“-”)考虑到填充长度中,这意味着 -2 返回为“-002”
这是一个例子:
#include <iostream>
#include "fmt/format.h"
int main()
std::cout << fmt::format(":04", -2) << std::endl;
将输出:-002
有没有办法切换这种行为或另一种方法来零填充值以获得我的预期结果?
感谢您的帮助,
【问题讨论】:
【参考方案1】:在 fmt 或 Python 的 str.format
(fmt 的语法基于此)的文档中肯定没有任何内容。两者都只声明填充是“符号感知的”。
This question 要求 Python 的 str.format
具有相同的功能。接受的答案是将长度移动到一个参数,如果数字为负数,则使其变大。将其翻译成 C++:
for (auto x : -2, 2 )
fmt::print("0:01\n", x, x < 0 ? 5 : 4 ); // prints -0002 and 0002
分解格式语法:
0:01
│ │ └ position of the argument with the length
│ └── "pad with zeros"
└──── position of the argument with the value
https://godbolt.org/z/5xz7T9
【讨论】:
谢谢,我担心我不得不以手动方式执行此操作...但是使用嵌套语法来格式化填充,结果看起来不会太糟糕。以上是关于使用 fmtlib,当值为负时,零填充数值更短,我可以调整这种行为吗?的主要内容,如果未能解决你的问题,请参考以下文章
DecimalFormat 为负双精度输入返回“?”而不是“-”