为什么这个<char>C++ money_put程序不起作用?

Why is this C++ money_put<char> program not working?

本文关键字:put 程序 money 不起作用 gt lt char 为什么 C++      更新时间:2023-10-16

我正在尝试使用c++语言环境,但无法弄清楚为什么输出是0.05而不是4.98

#include <iostream>
#include <vector>
#include <string>
#include <locale>
using namespace std;
int main(int argc, const char** argv) {

    vector<string> locales;
    locales.push_back("de_DE");
    locales.push_back("en_AU");
    locales.push_back("en_GB");
    locales.push_back("zh_CN");
    long double amount = 4.98;
    for (size_t i = 0, s = locales.size(); i < s; ++i) {
        if (locales[i] != "C") {
            cout.imbue(locale(locales[i].c_str()));
            cout << i << " (" << locales[i] << "): ";
            const moneypunct<char>& mp = use_facet<moneypunct<char> >(cout.getloc());
            const money_put<char>& mv = use_facet<money_put<char> >(cout.getloc());
            cout << mp.curr_symbol();
            ostreambuf_iterator<char> out(cout);
            mv.put(out, false, cout, cout.fill(), amount);
            cout << endl;
        }
    }
    return 0;
}

程序的输出如下:

0 (de_DE): Eu0,05
1 (en_AU): $0.05
2 (en_GB): £0.05
3 (zh_CN): ¥0.05

我做错了什么?

(简化的)答案是money_put<char>.put()函数指的是long double的一个参数,称为units。这是美分的单位,而不是美元

[locale.money.put.virtuals]

参数units被转换成一个宽字符序列,就像通过

ct.widen(buf1, buf1 + sprintf(buf1, "%.0Lf", units), buf2)

您可以在cppreference页面找到详尽的信息