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
。units
为宽字符串,其中 ct
为 str.getloc() 中感染的 std::ctype 平面,而 buf1
和 buf2
是充分大的字符缓冲区。按后述方式处理、格式化结果字符串 buf2
并输出到 out
。digits
采取仅有的可选前导负号(以与 ct.widen('-')
比较确定,其中 ct
为 str.getloc() 中感染的 std::ctype 平面)和立即后随的数位字符(以 ct
分类)为字符序列,按后述方式处理、格式化,并输出到 out
。给定来自先前步骤的字符序列,若首字符等于 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
的副本到所有其他字符后 - 否则,将填充字符置于所有其他字符前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_get 与 std::money_put 所用的货币格式解析器的参数 (类模板) | |
从输入字符序列中解析并构造货币值 (类模板) | |
(C++11) |
格式化并输出货币值 (函数模板) |