Namespaces
Variants

std::money_put<CharT,OutputIt>:: put, do_put

From cppreference.net
std::money_put
Member functions
money_put::put money_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)

Форматирует денежное значение и записывает результат в выходной поток.

1,2) Открытые функции-члены, вызывают функцию-член do_put наиболее производного класса.
3) Числовые аргументы units преобразуются в строку широких символов как если бы с помощью ct. widen ( buf1, buf1 + std:: sprintf ( buf1, "%.0Lf" , units ) , buf2 ) , где ct является фасетом std::ctype , установленным в str. getloc ( ) , а buf1 и buf2 являются достаточно большими символьными буферами. Полученная символьная строка buf2 обрабатывается, форматируется и выводится в out как описано ниже.
4) Из строкового аргумента digits берутся только опциональный ведущий знак минуса (определяемый сравнением с ct. widen ( '-' ) , где ct является фасетом std::ctype , внедренным в str. getloc ( ) ) и непосредственно следующие символы цифр (классифицируемые с помощью ct ), которые обрабатываются, форматируются и выводятся в out , как описано ниже.

Учитывая последовательность символов из предыдущих шагов, если первый символ равен 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)
форматирует и выводит денежное значение
(шаблон функции)