std::money_put<CharT,OutputIt>::put, do_put
Определено в заголовке <locale> |
||
|---|---|---|
public:
iter_type put( iter_type out, bool intl, std::ios_base& f,
char_type fill, long double quant ) const; |
(1) | |
iter_type put( iter_type out, bool intl, std::ios_base& f,
char_type fill, const string_type& quant ) const; |
(2) | |
protected:
virtual iter_type do_put( iter_type out, bool intl, std::ios_base& str,
char_type fill, long double units ) const; |
(3) | |
virtual iter_type do_put( iter_type out, bool intl, std::ios_base& str,
char_type fill, const string_type& digits ) const; |
(4) |
Форматирует денежную величину и записывает результат в поток вывода.
do_put самого производного класса.units преобразуются в строку широких символов как будто с помощью ct.widen(buf1, buf1 + std::sprintf(buf1, "%.0Lf", units), buf2), где ct — std::ctype фасет, встроенный в str.getloc(), а buf1 и buf2 — достаточно большие буферы символов. Полученная строка символов buf2 обрабатывается, форматируется и выводится в out, как описано ниже.digits берётся только необязательный знак минус (определяемый по сравнению с ct.widen('-'), где ct — std::ctype фасет, встроенный в str.getloc() ) и следующие за ним символы цифр (как классифицируемые ct) как последовательность символов для обработки, форматирования и вывода в out как описано ниже.Учитывая последовательность символов из предыдущих шагов, если первый символ равен ct.widen('-'), вызывается mp.neg_format() для получения формата pattern, в противном случае вызывается mp.pos_format(), где mp — фасет std::moneypunct<CharT, intl> встроенный в str.getloc().
Разделители тысяч и десятичных знаков вставляются по мере необходимости mp.grouping(), mp.frac_digits(), mp.decimal_point(), и mp.thousands_sep(), и полученная строка размещается в выходной последовательности, где value появляется в формате.
Если str.flags() & str.showbase не равно нулю (был использован манипулятор std::showbase), то символ или строка валюты генерируются вызовом mp.curr_symbol() и размещаются в выходной последовательности, где symbol появляется в формате.
Если mp.positive_sign() (в случае использования положительного формата) или mp.negative_sign() (в случае использования отрицательного формата) возвращают строку с более чем одним символом, первый возвращённый символ размещается в выходной последовательности, где sign появляется в формате, а остальные символы размещаются после всех других символов, например, формат {sign, value, space, symbol} с единицами 123 и знаком минуса "-" может привести к "-1.23 €", в то время как знак минуса "()" сгенерирует "(1.23 €)".
Если количество сгенерированных символов для указанного формата меньше значения, возвращаемого str.width(), то копии fill вставляются, чтобы полная длина выходной последовательности составила ровно str.width(), следующим образом:
- Если
str.flags() & str.adjustfieldравноstr.internal, символы заполнения вставляются там, гдеnoneилиspaceпоявляются в формате. - В противном случае, если
str.flags() & str.adjustfieldравноstr.left, копииfillдобавляются после всех других символов. - В противном случае символы заполнения размещаются перед всеми другими символами.
В конце вызывается str.width(0) для отмены действия любых std::setw.
Возвращаемое значение
Итератор, указывающий сразу после последнего сгенерированного символа.
Примечания
Единицы валюты предполагаются наименьшими нефракционными единицами валюты: центами в США, иенами в Японии.
Пример
#include <iomanip>
#include <iostream>
#include <locale>
struct my_punct : std::moneypunct_byname<char, false>
{
my_punct(const char* name) : moneypunct_byname(name) {}
string_type do_negative_sign() const { return "()"; }
};
int main()
{
std::locale loc("ru_RU.utf8");
std::cout.imbue(loc);
long double units = -123.45;
std::cout << "In Russian locale, " << units << " prints as " << std::showbase;
// note, the following is equivalent to simply std::put_money(units)
std::use_facet<std::money_put<char>>(loc).put(
{std::cout}, false, std::cout, std::cout.fill(), units);
std::cout << '\n';
std::cout.imbue(std::locale(std::cout.getloc(), new my_punct("ru_RU.utf8")));
std::cout << "With negative_sign set to \"()\", it prints as ";
std::use_facet<std::money_put<char>>(loc).put(
{std::cout}, false, std::cout, std::cout.fill(), units);
std::cout << '\n';
}Вывод:
In Russian locale, -123,45 prints as -1.23 руб With negative_sign set to "()", it prints as (1.23 руб)
Отчеты об ошибках
Следующие отчеты об ошибках, изменяющих поведение, были применены ретроактивно к ранее опубликованным стандартам C++.
| DR | Применяется к | Поведение, как опубликовано | Правильное поведение |
|---|---|---|---|
| LWG 328 | C++98 | строка формата, используемая для std::sprintf была "%.01f" |
исправлено на "%.0Lf" |
См. также
определяет параметры денежного форматирования, используемые std::money_get и std::money_put (шаблон класса) |
|
| анализирует и строит денежную величину из последовательности входных символов (шаблон класса) |
|
|
(C++11) |
форматирует и выводит денежную величину (шаблон функции) |
© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/locale/money_put/put