最終更新日時:
が更新

履歴 編集

function
<locale>

std::money_get::do_get

protected:
  virtual iter_type
    do_get(iter_type s,
           iter_type end,
           bool intl,
           ios_base& str,
           ios_base::iostate& err,
           long double& units) const;  // (1) C++98

  virtual iter_type
    do_get(iter_type s,
           iter_type end,
           bool intl,
           ios_base& str,
           ios_base::iostate& err,
           string_type& digits) const; // (2) C++98

概要

金額を解析する。get()から呼び出される、実際の解析を行う仮想関数である。

  • (1) : 解析結果を整数値としてunitsへ格納する
  • (2) : 解析結果を数字の列としてdigitsへ格納する

効果

sから文字を読み取り、金額を解析して構築する。書式はstr.getloc()から取得したmoneypunct<charT, Intl>ファセットmp、文字の対応付けは同様に取得したctype<charT>ファセットct、およびstr.flags()によって決まる。

妥当な列を認識した場合、errは変更しない。そうでない場合はerrfailbitを設定し(読み取れる文字がもうない場合はeofbitも設定する)、unitsおよびdigitsは変更しない。

すべての値の解析にはmp.neg_format()が返すパターンを使用する。

結果は、(1)ではunitsに整数値として格納され、(2)ではdigitsに数字の列(負の場合は先頭にマイナス符号)として格納される。たとえば米国の一般的なロケールにおける$1,056.23は、unitsでは105623digitsでは"105623"となる。

桁区切りの扱い

mp.grouping()が桁区切りを許可しないことを示す場合、そのような文字は読み取られず、それが最初に現れた位置で解析が終了する。そうでない場合、桁区切りは省略可能であり、存在する場合は、すべての書式要素を読み取った後にのみ配置の正しさが検査される。

空白と通貨記号の扱い

  • 書式パターンの最後の要素がmoney_base::spaceもしくはmoney_base::noneである場合、空白は消費されない
  • 書式パターンの先頭側の要素にmoney_base::spaceが現れる場合、1文字以上の空白が必要である
  • 書式パターンの先頭側の要素にmoney_base::noneが現れる場合、空白は許容されるが必須ではない
  • (str.flags() &std::ios_base::showbase)falseである場合、通貨記号は省略可能であり、書式を完成させるために他の文字が必要な場合にのみ消費される。そうでない場合、通貨記号は必須である

符号の扱い

mp.positive_sign()が返す文字列pos、もしくはmp.negative_sign()が返す文字列negの最初の文字が、書式パターンのsignが示す位置で認識された場合、その文字は消費され、文字列の残りの文字は他のすべての書式要素の後に要求される。

posまたはnegが空である場合、符号要素は省略可能であり、符号が検出されなかった場合は、空文字列であった側に対応する符号が結果に与えられる。そうでない場合、示された位置の文字はposまたはnegの最初の文字と一致しなければならず、対応する符号が結果に与えられる。posの最初の文字がnegの最初の文字と等しい場合、または両方が空である場合、結果には正の符号が与えられる。

数値部分の抽出と変換

金額の数値部分の数字は、現れた順に抽出される。結果が負である場合に限り、先頭にマイナス符号が置かれる。抽出された数字は、(2)ではdigitsへ直接格納され、(1)ではunitsの値を求めるための変換用の文字バッファbuf1へ格納される。

unitsの値は、以下を行ったかのようにして求められる。

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);

ここでnbuf1へ格納された文字数、buf2は文字バッファであり、srcatomsは以下のように定義される。

static const char src[] = "0123456789-";
charT atoms[sizeof(src)];
ct.widen(src, src + sizeof(src) - 1, atoms);

すなわち、ロケール依存の数字文字atomsから、対応する基本文字集合の数字srcへ読み替えたうえで、std::sscanfによって数値化される。この読み替えはctype::narrowとは意味論が異なる。

戻り値

妥当な金額の一部として認識した最後の文字の直後を指すイテレータ。

バージョン

言語

  • C++98

関連項目