• C++标准模板(STL)- 输入/输出操纵符-(std::get_money,std::put_money)


    操纵符是令代码能以 operator<< 或 operator>> 控制输入/输出流的帮助函数。

    不以参数调用的操纵符(例如 std::cout << std::boolalpha; 或 std::cin >> std::hex; )实现为接受到流的引用为其唯一参数的函数。 basic_ostream::operator<< 和 basic_istream::operator>> 的特别重载版本接受指向这些函数的指针。这些函数(或函数模板的实例化)是标准库中仅有的可取址函数。 (C++20 起)

    以参数调用的操纵符(例如 std::cout << std::setw(10); )实现为返回未指定类型对象的函数。这些操纵符定义其自身的进行请求操作的 operator<< 或 operator>> 。

    定义于头文件
     


    剖析货币值

    std::get_money

    template< class MoneyT >
    /*unspecified*/ get_money( MoneyT& mon, bool intl = false );

    (C++11 起)

    用于表达式 in >> get_money(mon, intl) 中时,分析字符输入为 in 中当前感染的 locale 的 std::money_get 平面所指定的货币值,并存储结果于 mon

    in >> get_money(mon, intl) 中的释出操作表现为有格式输入函数 (FormattedInputFunction) 。

    参数

    mon-要被写入货币值的变量。能为 long double 或 basic_string 之一
    intl-若为 true 则期待找到要求的国际通货字符串,否则期待可选的通货符号

    返回值

    返回未指定类型对象,使得若 in 为 std::basic_istream 类型输入流的名称,则表达式 in >> get_money(mon, intl) 表现为如同执行下列代码:

    1. typedef std::istreambuf_iterator<CharT, Traits> Iter;
    2. typedef std::money_get<CharT, Iter> MoneyGet;
    3. std::ios_base::iostate err = std::ios_base::goodbit;
    4. const MoneyGet &mg = std::use_facet<MoneyGet>(in.getloc());
    5. mg.get(Iter(in.rdbuf()), Iter(), intl, in, err, mon);
    6. if (std::ios_base::goodbit != err)
    7. out.setstate(err);

    调用示例 

    GCC和libstdc的MinGW端口仅支持"C""POSIX"环境。

    1. #include <iostream>
    2. #include <sstream>
    3. #include <locale>
    4. #include <iomanip>
    5. int main()
    6. {
    7. std::istringstream in("$1,234.56 2.22 USD 3.33");
    8. long double v1, v2;
    9. std::string v3;
    10. in.imbue(std::locale("en_US.UTF-8"));
    11. in >> std::get_money(v1) >> std::get_money(v2) >> std::get_money(v3, true);
    12. if (in)
    13. {
    14. std::cout << in.str() << " parsed as: "
    15. << v1 << ", " << v2 << ", " << v3 << '\n';
    16. }
    17. else
    18. {
    19. std::cout << "Parse failed";
    20. }
    21. return 0;
    22. }

    输出

    "$1,234.56 2.22 USD  3.33" parsed as: 123456, 222, 333

    格式化并输出货币值

    std::put_money

    template< class MoneyT >
    /*unspecified*/ put_money( const MoneyT& mon, bool intl = false );

    (C++11 起)

    用于表达式 out << put_money(mon, intl) 时,转换货币值 monout 中当前感染的 locale 的 std::money_put 平面所指定的字符表示。

    out << put_money(mon, intl) 中的插入操作表现为有格式输出函数 (FormattedOutputFunction) 。

    参数

    mon-货币值, long double 或 std::basic_string 之一
    intl-若为 true 则使用国际通货字符串,否则使用通货符号

    返回值

    返回未指定类型的对象,使若 out 为 std::basic_ostream 类型输出流的名称,则表达式 out << put_money(mon, intl) 表现如同执行下列代码:

    1. typedef std::ostreambuf_iterator<CharT, Traits> Iter;
    2. typedef std::money_put<CharT, Iter> MoneyPut;
    3. const MoneyPut& mp = std::use_facet<MoneyPut>(out.getloc());
    4. const Iter end = mp.put(Iter(out.rdbuf()), intl, out, out.fill(), mon);
    5. if (end.failed())
    6. out.setstate(std::ios::badbit);

    调用示例

    GCC和libstdc的MinGW端口仅支持"C""POSIX"环境。

    1. #include <iostream>
    2. #include <iomanip>
    3. int main()
    4. {
    5. long double mon = 123.45; // 或 std::string mon = "123.45";
    6. std::cout.imbue(std::locale("en_US.utf8"));
    7. std::cout << std::showbase
    8. << "en_US: " << std::put_money(mon)
    9. << " or " << std::put_money(mon, true) << std::endl;
    10. std::cout.imbue(std::locale("ru_RU.utf8"));
    11. std::cout << "ru_RU: " << std::put_money(mon)
    12. << " or " << std::put_money(mon, true) << std::endl;
    13. std::cout.imbue(std::locale("ja_JP.utf8"));
    14. std::cout << "ja_JP: " << std::put_money(mon)
    15. << " or " << std::put_money(mon, true) << std::endl;
    16. return 0;
    17. }

    输出

    1. en_US: $1.23 or USD 1.23
    2. ru_RU: 1.23 руб or 1.23 RUB
    3. ja_JP: ¥123 or JPY 123

  • 相关阅读:
    生信教程:使用全基因组SNP数据进行ABBA-BABA分析
    JavaScript 64 JavaScript 函数 64.2 JavaScript 函数参数
    SpringBoot-28-springSecurity注销和权限控制
    SPA项目开发之CRUD+表单验证
    进程线程知识之线程同步
    Access denied for user ‘itstar‘@‘%localhost‘ to database ‘sc‘
    机器学习之过拟合与欠拟合,K折交叉验证详解【含代码】
    面试官:工作中用过锁么?说说乐观锁和悲观锁的优劣势和使用场景
    第 299 场周赛 第四题 6103. 从树中删除边的最小分数
    【2022最新算法】凌日搜索优化算法(Matlab代码实现)
  • 原文地址:https://blog.csdn.net/qq_40788199/article/details/133420165