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() 获得格式化 pattern,否则就会调用 mp.pos_format(),其中 mp 是 str.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,那么就会插入填充字符到
none
或space
在格式化模式中出现的位置。 - 否则,如果 str.flags() & str.adjustfield 等于 str.left,那么就会后附 fill 的副本到所有其他字符后。
- 否则,将填充字符置于所有其他字符前。
最后,调用 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 << "在俄语本地环境中," << units << " 会输出为 " << 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 << "负号设置为 \"()\" 的情况下会输出 "; std::use_facet<std::money_put<char>>(loc).put( {std::cout}, false, std::cout, std::cout.fill(), units); std::cout << '\n'; }
输出:
在俄语本地环境中,-123,45 会输出为 -1.23 руб 负号设置为 "()" 的情况下会输出 (1.23 руб)
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
---|---|---|---|
LWG 328 | C++98 | std::sprintf 使用的格式字符串是 "%.01f" | 改成 "%.0Lf" |
参阅
定义 std::money_get 与 std::money_put 所用的货币格式解析器的参数 (类模板) | |
从输入字符序列中解析并构造货币值 (类模板) | |
(C++11) |
格式化并输出货币值 (函数模板) |