命名空间
变体
操作

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

来自 cppreference.com
< cpp‎ | locale‎ | money put
 
 
 
std::money_put
成员函数
money_put::putmoney_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 是注入到 str.getloc() 中的 std::ctype 方面,而 buf1buf2 是足够大的字符缓冲区。生成的字符字符串 buf2 会被处理、格式化并输出到 out 中,如以下所述。
4) 从字符串参数 digits 中,只取可选的前导减号(通过与 ct.widen('-') 比较来确定,其中 ct 是注入到 str.getloc() 中的 std::ctype 方面)和紧随其后的数字字符(由 ct 分类),作为要处理、格式化并输出到 out 中的字符序列,如以下所述。

给定来自上一步的字符序列,如果第一个字符等于 ct.widen('-'),则调用 mp.neg_format() 来获得格式化 模式,否则调用 mp.pos_format(),其中 mp 是注入到 str.getloc() 中的 std::moneypunct<CharT, intl> 方面。

千位分隔符和小数点字符根据 mp.grouping()mp.frac_digits()mp.decimal_point()mp.thousands_sep() 的要求插入,生成的字符串将被放置在输出序列中,其中 出现在格式化模式中。

如果 str.flags() & str.showbase 非零(使用了 std::showbase 操纵器),则货币符号或字符串将通过调用 mp.curr_symbol() 生成,并被放置在输出序列中,其中 符号 出现在格式化模式中。

如果 mp.positive_sign()(如果使用正数格式模式)或 mp.negative_sign()(如果使用负数格式模式)返回的字符串包含不止一个字符,则返回的第一个字符将被放置在输出序列中,其中 符号 出现在格式化模式中,其余字符将被放置在所有其他字符之后,例如,格式化模式 {sign, value, space, symbol} 以及 units 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 的副本将被附加到所有其他字符之后。
  • 否则,填充字符将被放置在所有其他字符之前。

最终,调用 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_getstd::money_put 使用的货币格式化参数
(类模板) [编辑]
从输入字符序列解析并构造货币值
(类模板) [编辑]
(C++11)
格式化并输出货币值
(函数模板) [编辑]