Namespaces
Variants

std::money_get<CharT,InputIt>:: get, do_get

From cppreference.net
std::money_get
Member functions
money_get::get money_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 または文字列に書き込みます。

1,2) パブリックメンバー関数は、最も派生したクラスのメンバー関数 do_get を呼び出します。
3,4) 入力イテレータ beg から文字を読み込み、 std:: ctype ファセット(このページでは ct と表記)によって指定された規則、 std:: moneypunct < CharT, intl > ファセット(このページでは mp と表記)によって指定された規則、および str. getloc ( ) にインプレースされたロケール、 str. flags ( ) から取得したストリーム書式フラグに従ってフォーマットされた通貨値を見つけることを期待します。

入力イテレータ beg が解析完了前に end と等しくなった場合、 err 内の failbit eofbit の両方を設定する。他の理由で解析が失敗した場合は、 failbit err に設定する。いずれの場合も、エラー時には出力パラメータ( units または digits )を変更しない。

解析が成功した場合、 err を変更せず、結果を units または digits に格納します。

この関数で使用される書式 パターン は常に mp. neg_format ( ) です。

mp. grouping ( ) が千の区切り文字を許可しない場合、最初に検出された区切り文字は解析エラーとして扱われます。それ以外の場合、区切り文字はオプションとして扱われます。

money_base::space または money_base::none pattern の最後の要素である場合、パーサーは通貨値の他の構成要素を解析した後に空白文字を消費しようとしません。それ以外の場合、 money_base::space が現れる場所では、1つ以上の空白文字が消費されます。

showbase フラグが str. flags ( ) で設定されている場合、通貨記号または通貨文字列は必須です。設定されていない場合、通貨記号は任意です。

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" は、 105623.0 という数値を units として、または文字列 "105623" digits として生成します。

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;
    // 以下のコードは 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)
通貨値を解析する
(関数テンプレート)