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

来自cppreference.com
< cpp‎ | locale‎ | money put
 
 
本地化库
本地环境与平面
本地环境
平面类别基类
ctype(字符类别)平面
numeric(数值)平面
collate(对照比较)平面
time(时间)平面
monetary(货币)平面
messages(消息)平面
字符分类与转换
字符分类
转换
编码转换平面
(C++11)    
C 本地环境
 
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) 如同用 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 的副本到所有其他字符后。
  • 否则,将填充字符置于所有其他字符前。

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