namespace std { class money_base { public: enum part { none, space, symbol, sign, value }; struct pattern { char field[4]; }; }; template <class charT, bool International = false> class moneypunct : public locale::facet, public money_base { public: using char_type = charT; using string_type = basic_string<charT>; explicit moneypunct(size_t refs = 0); charT decimal_point() const; charT thousands_sep() const; string grouping() const; string_type curr_symbol() const; string_type positive_sign() const; string_type negative_sign() const; int frac_digits() const; pattern pos_format() const; pattern neg_format() const; static locale::id id; static const bool intl = International; protected: ~moneypunct(); virtual charT do_decimal_point() const; virtual charT do_thousands_sep() const; virtual string do_grouping() const; virtual string_type do_curr_symbol() const; virtual string_type do_positive_sign() const; virtual string_type do_negative_sign() const; virtual int do_frac_digits() const; virtual pattern do_pos_format() const; virtual pattern do_neg_format() const; }; }
moneypunct<> Фасет определяет денежные параметры форматирования , используемые money_get<> и money_put<>. Денежный формат представляет собой последовательность из четырех компонентов, задается pattern значением p, таким образом, что part значение static_cast<part>(p.field[i]) определяет iй компонент формата249 В field члене pattern объекта, каждое значении symbol, sign, value, и или space или none появляется ровно один раз. Значение none, если оно присутствует, не является первым; значение space, если оно есть, не является ни первым, ни последним.
В тех местах, где none или spaceпоявляется, в формате разрешены пробелы, кроме тех, где они none появляются в конце, и в этом случае пробелы не допускаются. Значение space указывает, что в этой позиции требуется хотя бы один пробел. Если symbol появляется, последовательность символов, возвращаемая curr_symbol() функцией, разрешена и может быть обязательной. Тамsign , где появляется, требуется первая (если есть) из последовательности символов, возвращаемых функцией positive_sign() или negative_sign()(соответственно, поскольку денежное значение неотрицательно или отрицательно). Любые оставшиеся символы знаковой последовательности требуются после всех остальных компонентов формата. Где value появляется, требуется абсолютное числовое значение в денежном выражении.
Формат числового денежного значения - десятичное число:
value ::= units [ decimal-point [ digits ]] | decimal-point digits
если frac_digits() возвращает положительное значение, или
value ::= units
иначе. Этот символ decimal-point указывает на символ, возвращаемый функцией decimal_point(). Остальные символы определены следующим образом:
units ::= digits [ thousands-sep units ] digits ::= adigit [ digits ]
В описании синтаксиса, символ adigit является любым из значений ct.widen(c) для c в диапазоне '0' через '9', включительно, и ct является ссылкой типа ,const ctype<charT>& полученным , как описано в определениях money_get<> и money_put<>. Символ thousands-sep - это символ, возвращаемый функцией thousands_sep(). Используемый пробел - это значение ct.widen(' '). Символы пробела - это те символы,c для которых выполняется ci.is(space, c) возврат true. Количество цифр, необходимых после десятичной точки (если есть), в точности равно значению, возвращаемому функцией frac_digits().
Размещение символов-разделителей тысяч (если есть) определяется значением, возвращаемым grouping(), определяемым идентично члену numpunct<>::do_grouping().
Массив char, а не массив part, указан pattern::field исключительно для эффективности.
charT decimal_point() const; charT thousands_sep() const; string grouping() const; string_type curr_symbol() const; string_type positive_sign() const; string_type negative_sign() const; int frac_digits() const; pattern pos_format() const; pattern neg_format() const;
charT do_decimal_point() const;
charT do_thousands_sep() const;
string do_grouping() const;
string_type do_curr_symbol() const;
string_type do_positive_sign() const;
string_type do_negative_sign() const;
int do_frac_digits() const;
pattern do_pos_format() const;
pattern do_neg_format() const;
Returns: В специализации требуемая в таблице 70 ([locale.category]), а именно moneypunct<char>, moneypunct<wchar_t>, moneypunct<char, true>, и moneypunct<wchar_t, true>, возвращает объект типа pattern инициализируется { symbol, sign, none, value }.256
В обычных регионах США это так '.'.
В обычных регионах США это так ','.
Чтобы указать группировку по 3 с, значение равно "\003" not "3".
Для международных специализаций (второй параметр шаблона true) это обычно четыре символа, обычно три буквы и пробел.
Обычно это пустая строка.
В обычных регионах США это 2.
Обратите внимание, что международный символ, возвращаемый функцией, do_curr_sym() обычно сам содержит пробел; например "USD ",.