std::money_put<CharT,OutputIt>::put, do_put
在头文件 <locale> 中定义 |
||
public: iter_type put( iter_type out, bool intl, std::ios_base& f, |
(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, |
(3) | |
virtual iter_type do_put( iter_type out, bool intl, std::ios_base& str, char_type fill, const string_type& digits ) const; |
(4) | |
格式化货币值并将结果写入输出流。
do_put
。给定来自上一步的字符序列,如果第一个字符等于 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,则填充字符将插入到格式化模式中
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) |
格式化并输出货币值 (函数模板) |