namespace std {
template <class moneyT>
unspecified get_money(moneyT& mon, bool intl = false); // (1) C++11
}
概要
金額書式から入力する。
intlにtrueを指定した場合は国際通貨表記 (JPYのような通貨記号) 、falseを指定した場合は各国内での通貨表記 (¥のような通貨記号) として解析する。
要件
型moneyTは、long doubleもしくはbasic_stringの特殊化のいずれかであること。
戻り値
未規定の型のオブジェクトを返す。inをbasic_istream<CharT, Traits>型のオブジェクトとして、式in >> get_money(mon, intl)は以下の関数fをf(in, mon, intl)と呼び出したかのように振る舞う:
template <class CharT, class Traits, class moneyT>
void f(basic_ios<CharT, Traits>& str, moneyT& mon, bool intl)
{
using Iter = istreambuf_iterator<CharT, Traits>;
using MoneyGet = money_get<CharT, Iter>;
ios_base::iostate err = ios_base::goodbit;
const MoneyGet& mg = use_facet<MoneyGet>(str.getloc());
mg.get(Iter(str.rdbuf()), Iter(), intl, str, err, mon);
if (ios_base::goodbit != err)
str.setstate(err);
}
式in >> get_money(mon, intl)は、basic_istream<CharT, Traits>&型を持ち、その値はinである。
備考
解析される金額は、通貨の最小単位 (日本円なら円、米ドルならセント) を単位とする値である。小数点の位置や通貨記号の有無は、ストリームに設定されているロケールのmoneypunctファセットによって決まる。
この関数は書式化入力関数として振る舞う。
例
#include <iostream>
#include <iomanip>
#include <sstream>
#include <string>
int main()
{
// Cロケールでは通貨記号がなく、小数点以下の桁数は0となる
std::istringstream ss("123456 987");
// long doubleで受け取る
long double value = 0;
ss >> std::get_money(value);
std::cout << value << std::endl;
// 文字列で受け取る
std::string digits;
ss >> std::get_money(digits);
std::cout << digits << std::endl;
}
出力
123456
987
バージョン
言語
- C++11
処理系
- Clang: 3.0 ✅
- GCC: 5.1 ✅
- ICC: ??
- Visual C++: ??