std::money_put<CharT,OutputIt>:: put, do_put
|
Определено в заголовочном файле
<locale>
|
||
|
public
:
iter_type put
(
iter_type out,
bool
intl,
std::
ios_base
&
f,
|
(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,
|
(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
наиболее производного класса.
Учитывая последовательность символов из предыдущих шагов, если первый символ равен ct. widen ( '-' ) , вызывает mp. neg_format ( ) для получения форматирующего шаблона , в противном случае вызывает 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)
|
форматирует и выводит денежное значение
(шаблон функции) |