std::p ut_money在使用GCC时不输出零值

std::put_money doesn't output zero value when using GCC

本文关键字:GCC 输出 ut money std      更新时间:2023-10-16

当货币值为零时,std::p ut_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 版,但其他版本似乎表现出相同的行为)

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

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

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

然后:

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

这并没有说明添加前导零。

我认为标准没有充分说明预期的行为。 https://wg21.link/LWG2983 会澄清一下。