使用GCC时,std :: put_money不输出零值

Jon*_*ton 6 c++ gcc g++ std iomanip

当货币值为零时,std :: put_money不会按预期输出'0'字符.我找不到任何解释这种行为的东西.

例:

#include <iostream>
#include <iomanip>
using namespace std;

int main() {
    cout.imbue(locale(""));
    cout << showbase << put_money(0.0);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我希望输出为"£0.00"(取决于语言环境),但我得到"£.00"

最终,为零值添加一个特殊情况并不是太麻烦,但这种行为对我来说仍然没有意义.这是什么原因(假设它是故意的),除了单独处理零,还有任何简单的解决方法吗?

更新

这似乎是编译器特定的,我有报告说它与clang和VS一样正常工作,所以可能gcc/g ++具体(版本4.9准确,但其他版本似乎显示相同的行为)

Jon*_*ely 0

虽然我最初认为这看起来像GCC bug,但现在我认为如果您严格阅读的话,您从 GCC 的 std::lib 获得的结果正是标准所要求的。

首先,使用 printf 格式说明符将数量转换为long double窄字符串"%.0Lf",生成“0”。它被转换为宽字符串(对于您的示例没有任何作用,因为输出是窄字符流)。

moneypunct<>::pos_format()然后根据区域设置或moneypunct<>::neg_format()格式化模式以及字符串是否以减号开头来格式化输出。

然后:

数字字符按照出现的顺序写入,并散布有格式指定的任何千位分隔符和小数点(在可选的前导减号之后)

这没有说明添加前导零。

我认为标准未明确规定预期行为。https://wg21.link/LWG2983 将澄清这一点。