std::money_get<CharT,InputIt>::get, do_get
| ヘッダ <locale> で定義
|
||
public: iter_type get(iter_type beg, iter_type end, bool intl, std::ios_base& str, std::ios_base::iostate& err, long double& units) const; |
(1) | |
iter_type get(iter_type beg, iter_type end, bool intl, std::ios_base& str, std::ios_base::iostate& err, string_type& digits) const; |
(2) | |
protected: virtual iter_type do_get(iter_type beg, iter_type end, bool intl, std::ios_base& str, std::ios_base::iostate& err, long double& units) const; |
(3) | |
virtual iter_type do_get(iter_type beg, iter_type end, bool intl, std::ios_base& str, std::ios_base::iostate& err, string_type& digits) const; |
(4) | |
入力イテレータから金額の値を解析し、その結果を long double または文字列に書き込みます。
do_get を呼びます。str.getloc() に設定されている std::ctype ファセット (以下 ct)、 str.getloc() に設定されている std::moneypunct<CharT, intl> ファセット (以下 mp) および str.flags() から取得されたストリーム書式化フラグによって指定されるルールに従って書式化された金額値が見つかることを期待して、入力イテレータ beg から文字を読み込みます。解析が完了する前に入力イテレータ beg が end と等しくなった場合は、 err に failbit と eofbit の両方をセットします。 他の理由で解析が失敗した場合は、 err に failbit をセットします。 いずれの場合も、エラーの時は出力引数 (units または digits) を変更しません。
解析に成功した場合は、 err を変更せず、結果を units または digits に格納します。
この関数によって使用される書式化の pattern は常に mp.neg_format() です。
mp.grouping() が桁区切り文字を許容しない場合、遭遇した最初の区切りは解析エラーとして扱われ、そうでなければ、それらはオプショナルとして扱われます。
money_base::space または money_base::none が pattern の最後の要素である場合、解析器は金額値の他の部分が解析された後のいかなるホワイトスペースも消費しようと試みません。 そうでなければ、 money_base::space が現れた位置で、1個以上のホワイトスペース文字が消費されます。
str.flags() に showbase フラグがセットされていれば、通貨記号または通貨文字列が要求され、セットされていなければ、通貨記号はオプショナルです。
mp.positive_sign() または mp.negative_sign() によって返される文字列の最初の文字が書式化パターンの money_base::sign の位置に見つかった場合、それは消費され、金額値の他のすべての部分の後、その文字列の残りの文字が期待され、消費されます。 mp.positive_sign() および mp.negative_sign() がどちらも空でない場合は、符号が要求され、それらの文字列のいずれかの最初の文字にマッチしなければなりません。 それらの文字列の一方が空の場合は、符号はオプショナルです (そしてそれがない場合は、結果の符号は空であった文字列に対応します)。 どちらの文字列も空の場合、または最初の文字が同じ場合、結果は正の符号が与えられます。 出力引数が文字列 (digits) であり、結果が負の場合は、値 ct.widen('-') が結果の先頭の文字として格納されます。
数字は現れる順に入力から抽出され、 digits (必要に応じて ct.widen() によってワイド化された後) または一時バッファ buf1 に置かれます。 units の値は、以下のように行われたかのように、 buf1 から構築されます。
static const char src[] = "0123456789-";
CharT atoms[sizeof(src)];
ct.widen(src, src + sizeof(src) - 1, atoms);
for (int i = 0; i < n; ++i)
buf2[i] = src[find(atoms, atoms+sizeof(src), buf1[i]) - atoms];
buf2[n] = 0;
sscanf(buf2, "%Lf", &units);
(ただし n は入力から抽出され buf1 に格納された文字数であり、 buf2 は別の十分大きな文字バッファです)
戻り値
金額文字列入力の有効な部分として認識された最後の文字の直後を指すイテレータ。
ノート
通貨単位はその通貨の最も小さな非小数単位であると仮定されます。 米国のセント、日本の円などです。 そのため、米国ロケールにおける入力シーケンス "$1,056.23" は units に数値 105623.0 を生成し、または digits に文字列 "105623" を生成します。
showbase がオフだけれども複数文字 negative_sign() 全体が要求される場合、通貨記号はオプショナルであるため、オフの showbase および "-" の negative_sign と共に書式化パターン {sign, value, space, symbol} が与えられたとき、文字列 "-1.23 €" は -123 として解析され、 "€" は入力ストリームに消費されずに残されますが、 negative_sign が "()" であれば、文字列 "(1.23 €)" は完全に消費されます。
入出力マニピュレータ std::get_money はこの関数へのより簡単なインタフェースを提供します。
例
#include <iostream>
#include <sstream>
#include <locale>
void demo_money_get(std::locale loc, const std::string& input)
{
std::istringstream str(input);
str.imbue(loc);
long double units;
// note, the following can be written simple with std::get_money(units)
std::ios_base::iostate err = std::ios_base::goodbit;
std::istreambuf_iterator<char> ret =
std::use_facet<std::money_get<char>>(loc).get(
std::istreambuf_iterator<char>(str),
std::istreambuf_iterator<char>(),
false, str, err, units);
str.setstate(err);
std::istreambuf_iterator<char> last{};
if(str) {
std::cout << "Successfully parsed '" << str.str() << "' as "
<< units/100 << " units\n";
if(ret != last) {
std::cout << "Remaining content: '";
std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
std::cout << "'\n";
} else {
std::cout << "The input was fully consumed\n";
}
} else {
std::cout << "Parse failed. Unparsed string: '";
std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
std::cout << "'\n";
}
}
int main()
{
demo_money_get(std::locale("en_US.utf8"), "-$5.12 abc");
demo_money_get(std::locale("ms_MY.utf8"), "(RM5.12) def");
}
出力:
Successfully parsed '-$5.12 abc' as -5.12 units
Remaining content: ' abc'
Successfully parsed '(RM5.12) def' as -5.12 units
Remaining content: ' def'
関連項目
| std::money_get および std::money_put で使用される金額の書式パラメータを定義します (クラステンプレート) | |
| 入力文字シーケンスから金額の値をパースおよび構築します (クラステンプレート) | |
(C++11) |
金額をパースします (関数テンプレート) |