某所でC++11のput_moneyで盛り上がっていたので、それに関連してC++03だとこうなるという話を書きます。

まず、C++11だとこんな風に書けるのです。

#include <iostream>
#include <iomanip>
#include <locale>
 
int main()
{
  std::string loc;
  std::cin >> loc;
 
  std::locale l(loc.c_str());
  std::cout.imbue(l);
 
  double x = 123456.789;
  std::cout << std::put_money(x, false) << std::endl;
}

put_moneyはlocaleに従って金額の書式で出力するマニピュレータです。

C++03でも、localeを直接叩けば同じ出力が得られます。

#include <iostream>
#include <locale>
 
int main()
{
  std::string loc;
  std::cin >> loc;
 
  std::locale l(loc.c_str());
  std::cout.imbue(l);
 
  double x = 123456.789;
 
  std::money_put<char> const& m =
    std::use_facet<std::money_put<char>>(l);
  m.put(std::cout, false, std::cout, ' ', x);
  std::cout << std::endl;
}

なお、この金額書式の情報は、C++で新規に登場したのではなく、Cでも存在しました。CだとLC_MONETARYのsetlocaleとlocaleconv/lconvです。

スポンサード リンク

この記事のカテゴリ

  • ⇒ put_moneyとmoney_put