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 в качестве последовательности символов для обработки, форматирования и вывода в out, как описано ниже, используются только необязательный начальный знак минуса (определяемый сравнением с ct.widen('-'), где ct — фасет std::ctype, внедрённый в str.getloc()) и следующие непосредственно за ним цифры (классифицируемые с помощью ct).Для последовательности символов, полученной на предыдущих этапах, если первый символ равен 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 и negative_sign, равным "-", может дать "-1.23 €", тогда как negative_sign, равный "()", даст "(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/cpp/locale/money_put/put