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

时间:2017-06-15 14:13:40

标签: 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;
}

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

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

更新

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

1 个答案:

答案 0 :(得分:0)

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

首先使用printf格式说明符ListBox将数量从long double转换为窄字符串,产生“0”。这被转换为一个宽字符串(对于你的例子,它没有任何作用,因为输出是一个窄字符流)。

然后根据区域设置的"%.0Lf"moneypunct<>::pos_format()格式模式对输出进行格式化,具体取决于字符串是否以减号开头。

然后:

  

数字字符被写入,按照格式指定的任意数千个分隔符和小数点,按它们出现的顺序(在可选的前导减号之后)点缀

这没有说明增加一个前导零。

我认为标准没有规定预期的行为。 https://wg21.link/LWG2983会澄清它。