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

来自cppreference.com
< cpp‎ | locale‎ | money 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) 如同用 ct.widen(buf1, buf1 + std::sprintf(buf1, "%.0Lf", units), buf2) 转换数值参数 units 为宽字符串,其中 ctstr.getloc() 中感染的 std::ctype 平面,而 buf1buf2 是充分大的字符缓冲区。按后述方式处理、格式化结果字符串 buf2 并输出到 out
4) 从字符串参数 digits 采取仅有的可选前导负号(以与 ct.widen('-') 比较确定,其中 ctstr.getloc() 中感染的 std::ctype 平面)和立即后随的数位字符(以 ct 分类)为字符序列,按后述方式处理、格式化,并输出到 out

给定来自先前步骤的字符序列,若首字符等于 ct.widen('-') ,则调用 mp.neg_format() 获得格式化 pattern ,否则调用 mp.pos_format() ,其中 mpstr.getloc() 中感染的 std::moneypunct<CharT, intl> 平面。

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 ,则插入填充字符到 nonespace 出现于格式化模式中的位置。
  • 否则,若 str.flags() & str.adjustfield 等于 str.left ,则后附 fill 的副本到所有其他字符后
  • 否则,将填充字符置于所有其他字符前characters.

最后,调用 str.width(0) 取消任何 std::setw 的效果。

返回值

指向最后产生字符立即后方的迭代器。

注意

假设通货单位为货币的最小非小数单位:美国中为美分,日本中为日元。

示例

#include <iostream>
#include <iomanip>
#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;
// 注意:以下等价于简单的 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 руб)

参阅

定义 std::money_getstd::money_put 所用的货币格式解析器的参数
(类模板)
从输入字符序列中解析并构造货币值
(类模板)
(C++11)
格式化并输出货币值
(函数模板)