std::p ut_money在使用GCC时不输出零值
std::put_money doesn't output zero value when using GCC
当货币值为零时,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 会澄清一下。
相关文章:
- 编译器资源管理器和 GCC 具有不同的输出
- GCC 仪器 - 是否可以自动输出函数的参数?
- std::p ut_money在使用GCC时不输出零值
- GCC 预处理器输出和编译一次通过,v2
- 为什么 gcc 和 clang 各自为这个程序产生不同的输出?(转换运算符与构造函数)
- 为什么Visual Studio和GCC为C 代码产生不同的输出
- GCC 编译器对类型转换有什么作用?为什么 mac 和 Linux 上的输出不同
- GCC 8 交叉编译器输出 ARMv7 可执行文件而不是 ARMv6
- GCC -FROFILE -ARCS:如何在自定义RTO上输出文件
- ofstream在极其简单的程序(GCC/Code::Blocks)中首次输出时崩溃
- 如何隐藏外部标头'note: ... ' gcc 输出?
- GCC.obj文件输出不具有确定性(.debug_info,PROGPITS部分)
- Eclipse 不解析 gcc 输出
- GCC和MSVC之间的文件输出不一致
- 可视化GDB在MSVC2012和GCC 7.3.1之间打印不同的C++输出
- 如何在windows中的gcc中逐行读取命令输出,就像使用标准输入一样
- GCC:减少输出中的模板名称
- 为什么GCC输出一个无法识别的二进制文件
- 通过阅读GCC输出学习汇编
- 尽管gcc -E输出正确,但#define宏中的无参数函数会导致错误