C ++中的货币格式

时间:2018-07-23 14:48:37

标签: c++ c++11

我想用C ++格式化价格

我可以使用std::put_money,但是问题是我的数字格式语言环境与货币语言环境不同。

说我想用法语格式化英镑的价格,如果我将语言环境设置为法语,则会得到一个欧元符号。我需要在用户语言环境中使用小数,在价格语言环境中使用货币。

在Java中,我可以使用NumberFormat来自十进制语言环境,然后在其上设置所需的货币。

这可以用C ++完成吗?

1 个答案:

答案 0 :(得分:4)

您可以创建自己的moneypunct构面(继承自std::moneypunct),并使用该构面来构建语言环境。您可以从两个语言环境名称构造此方面。一个负责货币符号,另一个负责其他所有内容。

template <class CharT, bool International = false>
class my_moneypunct;

template <class CharT, bool International = false>
class my_moneypunct_byname : public std::moneypunct_byname<CharT, International>
{
  friend class my_moneypunct<CharT, International>;
  using std::moneypunct_byname<CharT, International>::moneypunct_byname;
};

template <class CharT, bool International>
class my_moneypunct : public std::moneypunct_byname<CharT, International>
{
    my_moneypunct_byname<CharT, International> other_moneypunct;
    public:
    explicit my_moneypunct(const char* myName, const char* otherName, std::size_t refs = 0) :
        std::moneypunct_byname<CharT, International>(myName, refs), other_moneypunct(otherName, refs) {}
    typename std::moneypunct_byname<CharT, International>::string_type do_curr_symbol() const override {
        return other_moneypunct.do_curr_symbol();
    }
    virtual ~my_moneypunct() = default;
};

您可以通过以下方式使用它:

std::moneypunct<char>* mp = new_moneypunct<char>("en_GB.UTF-8", "fr_FR.UTF-8");
// or std::moneypunct<char>* mp = new_moneypunct<char>("fr_FR.UTF-8", "en_GB.UTF-8");
std::locale newloc(std::locale(), mp);
std::cout.imbue(newloc);
std::cout << std::showbase << std::put_money("1234567");
// prints '€12,345.67' or '12 345,67 £'

请注意,未对此进行内存泄漏测试。

您也可以不继承std::moneypunct_byname,而仅继承std::moneypunct,并将每个可覆盖的方法转发到您使用moneypunct从多个语言环境获取的不同std::use_facet方面。或硬编码您的货币符号,或您喜欢的任何其他方式。