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, |
(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, |
(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 を呼び出します。ct)、str.getloc() に埋め込まれた std::moneypunct<CharT, intl> ファセット(このページでは mp)、および str.flags() から取得したストリームフォーマットフラグによって指定されたルールに従ってフォーマットされた通貨値を見つけることを期待します。解析が完了する前に、入力イテレータ 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 の値が以下のように構築されます。
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() 全体が必須であるため、フォーマットパターン {sign, value, space, symbol} で showbase がオフ、かつ negative_sign が "-" の場合、文字列 "-1.23 €" は -123 として解析され、"€" は入力ストリームに未消費のまま残ります。しかし、negative_sign が "()" の場合、文字列 "(1.23 €)" は完全に消費されます。
I/O マニピュレータ std::get_money は、この関数へのよりシンプルなインターフェースを提供します。
[編集] 例
#include <iostream> #include <locale> #include <sstream> void demo_money_get(std::locale loc, const std::string& input) { std::istringstream str(input); str.imbue(loc); long double units; // The following can be written simpler 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) |
通貨の値を構文解析する (関数テンプレート) |