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 берётся только необязательный знак минус (определяемый по сравнению с 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"

См. также

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/w/cpp/locale/money_put/put

Spec-Zone.ru

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