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

时间:2014-07-01 04:03:48

标签: c++ localization internationalization locale

我正在尝试使用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

我做错了什么?

2 个答案:

答案 0 :(得分:3)

(简化)答案是money_put<char>.put()函数引用名为long double的{​​{1}}参数。这是美分中的单位,而不是美元

答案 1 :(得分:1)

[locale.money.put.virtuals]

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

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

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