Spec-Zone.ru › C++

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)

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

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 в качестве последовательности символов для обработки, форматирования и вывода в 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"

См. также

moneypunct
задаёт параметры форматирования денежных значений, используемые std::money_get и std::money_put
(шаблон класса)
money_get
разбирает последовательность входных символов и создаёт из неё денежное значение
(шаблон класса)
put_money
(C++11)
форматирует и выводит денежное значение
(шаблон функции)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/locale/money_put/put

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API