我想用C ++格式化价格
我可以使用std::put_money
,但是问题是我的数字格式语言环境与货币语言环境不同。
说我想用法语格式化英镑的价格,如果我将语言环境设置为法语,则会得到一个欧元符号。我需要在用户语言环境中使用小数,在价格语言环境中使用货币。
在Java中,我可以使用NumberFormat来自十进制语言环境,然后在其上设置所需的货币。
这可以用C ++完成吗?
答案 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
方面。或硬编码您的货币符号,或您喜欢的任何其他方式。