c++11 标准模板(STL)本地化库 - 平面类别(std::money_put) - 格式化货币值为字符序列以输出

news2024/11/17 21:35:36

本地化库

本地环境设施包含字符分类和字符串校对、数值、货币及日期/时间格式化和分析,以及消息取得的国际化支持。本地环境设置控制流 I/O 、正则表达式库和 C++ 标准库的其他组件的行为。

平面类别

格式化货币值为字符序列以输出

std::money_put
template<

    class CharT,
    class OutputIt = std::ostreambuf_iterator<CharT>

> class money_put;

std::money_put 封装格式化货币值为字符串所用的规则。标准 I/O 操纵符 std::put_money 使用 I/O 流的 locale 的 std::money_put 平面。

继承图

类型要求

- OutputIt 必须满足遗留输出迭代器 (LegacyOutputIterator) 的要求。

特化

标准库提供二个孤立(独立于本地环境)的全特化和二个部分特化:

定义于头文件 <locale>

std::money_put<char>创建货币值的窄字符串表示
std::money_put<wchar_t>创建货币值的宽窄字符串表示
std::money_put<char, OutputIt>用定制输入迭代器创建货币值的窄字符串表示
std::money_put<wchar_t, OutputIt>用定制输入迭代器创建货币值的宽字符串表示

另外, C++ 程序中构造的每个 locale 对象都实装这些特化的其自身(本地环境限定)版本。

成员类型

成员类型定义
char_typeCharT
string_typestd::basic_string<CharT>
iter_typeOutputIt

成员函数

(构造函数)

构造新的 money_put 平面
(公开成员函数)

(析构函数)

销毁 money_put 平面
(受保护成员函数)

put

调用 do_put
(公开成员函数)

受保护成员函数

do_put

[虚]

格式化货币值并写入到输出流
(虚受保护成员函数)

成员对象

static std::locale::id id

locale 的 id
(公开成员对象)

构造新的 money_put 平面

构造新的 money_put 平面

explicit money_put( std::size_t refs = 0 );

创建 std::money_put 平面并转发引用计数 refs 到基类构造函数 locale::facet::facet() 。

参数

refs-开始的引用计数

销毁 money_put 平面

std::money_put<CharT,OutputIt>::~money_put

protected: ~money_put();

析构 std::money_put 平面。此析构函数为受保护且为虚(由于基类析构函数为虚)。 std::money_put 类型对象,同大多数平面,只能在最后一个实装此平面的 std::locale 离开作用域时,或若用户定义导出自 std::money_put 并实现公开构造函数,才会被销毁。

调用示例

#include <iostream>
#include <locale>

struct Destructible_money_put : public std::money_put<wchar_t>
{
    Destructible_money_put(std::size_t refs = 0) : money_put(refs) {}
    // 注意:隐式析构函数为公开
};

int main()
{
    Destructible_money_put dc;
    // std::money_put<wchar_t> c;  // 编译错误:受保护析构函数
    return 0;
}

格式化货币值并写入到输出流

std::money_put<CharT,OutputIt>::put, do_put
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 为宽字符串,其中 ct 为 str.getloc() 中感染的 std::ctype 平面,而 buf1buf2 是充分大的字符缓冲区。按后述方式处理、格式化结果字符串 buf2 并输出到 out

4) 从字符串参数 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 ,则插入填充字符到 nonespace 出现于格式化模式中的位置。
  • 否则,若 str.flags() & str.adjustfield 等于 str.left ,则后附 fill 的副本到所有其他字符后
  • 否则,将填充字符置于所有其他字符前characters.

最后,调用 str.width(0) 取消任何 std::setw 的效果。

返回值

指向最后产生字符立即后方的迭代器。

注意

假设通货单位为货币的最小非小数单位:美国中为美分,日本中为日元。

调用示例 windows

#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>
#include <vector>
#include <algorithm>
#include <iterator>
#include <Windows.h>

std::vector<std::wstring> locals;

BOOL CALLBACK MyFuncLocaleEx(LPWSTR pStr, DWORD dwFlags, LPARAM lparam)
{
    locals.push_back(pStr);
    return TRUE;
}

std::string stows(const std::wstring& ws)
{
    std::string curLocale = setlocale(LC_ALL, NULL); // curLocale = "C";
    setlocale(LC_ALL, "chs");
    const wchar_t* _Source = ws.c_str();
    size_t _Dsize = 2 * ws.size() + 1;
    char *_Dest = new char[_Dsize];
    memset(_Dest, 0, _Dsize);
    wcstombs(_Dest, _Source, _Dsize);
    std::string result = _Dest;
    delete[]_Dest;
    setlocale(LC_ALL, curLocale.c_str());
    return result;
}

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()
{
    EnumSystemLocalesEx(MyFuncLocaleEx, LOCALE_ALTERNATE_SORTS, NULL, NULL);

    for (std::vector<std::wstring>::const_iterator str = locals.begin();
            str != locals.end(); ++str)
    {
        std::locale locale(stows(*str));
        std::cout.imbue(locale);

        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>>(locale).put(
        {std::cout}, false, std::cout, std::cout.fill(), units);
        std::cout << std::endl;

        std::cout.imbue(std::locale(std::cout.getloc(), new my_punct(locale.name().c_str())));
        std::cout << "With negative_sign set to \"()\", it prints  as ";
        std::use_facet<std::money_put<char>>(locale).put(
        {std::cout}, false, std::cout, std::cout.fill(), units);
        std::cout << std::endl;
    }

    return 0;
}

输出

In Russian locale, -123,45 prints as -1,23 €
With negative_sign set to "()", it prints  as (1,23 €)
In Russian locale, -123,45 prints as -1,23 €
With negative_sign set to "()", it prints  as (1,23 €)
In Russian locale, -123,45 prints as -1,23 Ft
With negative_sign set to "()", it prints  as (1,23 Ft)
In Russian locale, -123.45 prints as -\123
With negative_sign set to "()", it prints  as (\123)
In Russian locale, -123,45 prints as -1,23 ?
With negative_sign set to "()", it prints  as (1,23 ?)
In Russian locale, -123.45 prints as -?.23
With negative_sign set to "()", it prints  as (?.23)
In Russian locale, -123.45 prints as ¥-1.23
With negative_sign set to "()", it prints  as ¥(1.23)
In Russian locale, -123.45 prints as ¥-1.23
With negative_sign set to "()", it prints  as ¥(1.23)
In Russian locale, -123.45 prints as -HK$1.23
With negative_sign set to "()", it prints  as (HK$1.23)
In Russian locale, -123.45 prints as -MOP1.23
With negative_sign set to "()", it prints  as (MOP1.23)
In Russian locale, -123.45 prints as -MOP1.23
With negative_sign set to "()", it prints  as (MOP1.23)
In Russian locale, -123.45 prints as -$1.23
With negative_sign set to "()", it prints  as ($1.23)
In Russian locale, -123.45 prints as -$1.23
With negative_sign set to "()", it prints  as ($1.23)
In Russian locale, -123.45 prints as -NT$1.23
With negative_sign set to "()", it prints  as (NT$1.23)
In Russian locale, -123.45 prints as -NT$1.23
With negative_sign set to "()", it prints  as (NT$1.23)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1662595.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Framework-IoC详解

IoC的概念和作用 在介绍Ioc之前&#xff0c;我们首先先了解一下以下内容 什么是程序的耦合 耦合性(Coupling)&#xff0c;也叫耦合度&#xff0c;是对模块间关联程度的度量。耦合的强弱取决于模块间接口的复杂性、调用模块的方式以及通过界面传送数据的多少。模块间的耦合度…

Git 如何管理标签命令(tag)

1.查看本地仓库tag --1.查看本地仓库tag UserDESKTOP-2NRT2ST MINGW64 /e/GITROOT/STARiBOSS/STARiBOSS-5GCA (gw_frontend_master) $ git tag 1stBossUpgrade V10.0.1_20220224_test V10.0.1_20220301_test tag-gwfrontend-V1.0.12-230625 tag-gw_frontend-23.08.29 tag-gw_f…

基于springboot实现毕业设计系统项目【项目源码+论文说明】

基于springboot实现毕业设计系统演示 摘要 在如今社会上&#xff0c;关于信息上面的处理&#xff0c;没有任何一个企业或者个人会忽视&#xff0c;如何让信息急速传递&#xff0c;并且归档储存查询&#xff0c;采用之前的纸张记录模式已经不符合当前使用要求了。所以&#xff…

C++:虚函数表Hook

Hook 在计算机编程中&#xff0c;"Hook"&#xff08;钩子&#xff09;是一种技术&#xff0c;用于拦截并修改特定事件或函数的执行流程。它允许程序员在特定的代码点插入自定义的代码&#xff0c;以实现对程序行为的修改、监视或增强。 虚函数表Hook 虚函数表&#…

Springboot+Vue项目-基于Java+MySQL的车辆管理系统(附源码+演示视频+LW)

大家好&#xff01;我是程序猿老A&#xff0c;感谢您阅读本文&#xff0c;欢迎一键三连哦。 &#x1f49e;当前专栏&#xff1a;Java毕业设计 精彩专栏推荐&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb;&#x1f447;&#x1f3fb; &#x1f380; Python毕业设计 &…

untiy 为预制体动态加载光照贴图

unity版本为2021.8 预制体不能携带光照贴图信息&#xff0c;只能我们自己准备了 多方查找加自己摸索终于找到了适合新版本的解决方案&#xff0c;直接贴代码 将这个脚本挂到预制体的最上级 using System.Collections; using System.Collections.Generic; using UnityEditor; …

【半夜学习MySQL】库的操作(含库的创建、删除、修改、备份操作/查看mysql连接情况/字符集和校验规则详谈)

&#x1f3e0;关于专栏&#xff1a;半夜学习MySQL专栏用于记录MySQL数据相关内容。 &#x1f3af;每天努力一点点&#xff0c;技术变化看得见 文章目录 创建数据库字符集和校验规则查看字符集合校验规则校验规则对数据库的影响 操纵数据库数据备份和恢复查看连接情况 创建数据库…

SDXL-ControlNet模型MistoLine:引领高精度图像生成的革新高质量图像模型

在数字艺术的浩瀚星空中&#xff0c;MistoLine犹如一颗璀璨的新星&#xff0c;以其对SDXL-ControlNet技术的深度整合&#xff0c;展示了对多种线稿类型的非凡适应能力&#xff0c;并在高精度图像生成领域树立了新的标杆。 GitHub&#xff1a;https://github.com/TheMistoAI/Mi…

Spring Framework-简介

Spring Framework Java Spring是一个开源的Java应用框架&#xff0c;它的主要目的是简化企业级应用开发的复杂性。Spring框架为开发者提供了许多基础功能&#xff0c;使得开发者能够更专注于业务逻辑的实现&#xff0c;而不是底层的细节。 主要特点和功能&#xff1a; 控制反…

Redis-新数据类型-Hyperloglog

新数据类型-Hyperloglog 简介 在我们做站点流量统计的时候一般会统计页面UV(独立访客:unique visitor)和PV(即页面浏览量&#xff1a;page view)。 什么是基数&#xff1f; 数据集&#xff5b;1&#xff0c;2&#xff0c;5&#xff0c;7&#xff0c;5&#xff0c;7&#xff…

Spring框架学习-详细

文章目录 1. Spring简介1.1 面向接口编程1.2 Spring简介1.3 Spring体系结构 2 Spring IoC - 基于XML2.1 Sping框架部署&#xff08;IoC&#xff09;2.2 Spring IoC使用2.3 IoC和DI2.4 DI依赖注入Spring容器通过反射方法实现属性注入有三种方式1. set方法注入2. 构造器注入 2.5 …

禁止打开浏览器时弹出 internet explorer 11 停用的通知

计算机管理&#xff08;我的电脑图标上右键&#xff09; - 管理模板 - windows 组件 - internet explorer 启用隐藏 internet explorer 11 停用通知&#xff0c;如下图所示

使用Valgrind工具套件中的Massif监测C++程序堆内存使用

Valgrind是一款用于内存调试、内存泄漏检测以及线程问题分析的套件。它由一系列的工具组成,适用于Linux、macOS等操作系统。下面简要介绍几个主要的Valgrind工具: Memcheck 这是Valgrind最常用的工具,用于检测程序中的内存错误,包括非法内存读写、使用未初始化的内存等。Cache…

【动态规划】子数组、子串系列II|等差数列划分|最长湍流子数组|单词拆分|环绕字符串中唯一的子字符串

一、等差数列划分 413. 等差数列划分 算法原理 &#x1f4a1;细节&#xff1a; 1.如果当前nums数组中i位置的数和前面两个数可以构成等差数列&#xff0c;那么当前位置所有子数组构成的等差数列个数dp[i]就等于前一个位置有子数组构成的等差数列个数1&#xff08;这个1代表增加…

基于MWORKS 2024a的MIMO-OFDM 无线通信系统设计

一、引言 在终端设备和数据流量爆发式增长的今天&#xff0c;如何提升通信系统容量、能量效率和频谱利用率成为5G通信的关键问题之一。大规模天线阵列作为5G及B5G无线通信关键技术通过把原有发送端天线数量提升一个或多个数量级&#xff0c;实现波束聚集、控制波束转向&#x…

钒回收树脂五氧化二钒净化回收工艺

钒是一种重要的工业金属&#xff0c;广泛应用于钢铁合金、化工、航空和电池材料等领域。随着资源的日益紧张和环保要求的提高&#xff0c;回收利用钒成为了一个重要的研究方向。树脂吸附技术是一种常用的从废水或废料中回收钒的方法&#xff0c;具有操作简便、效率高、成本相对…

OpenCV中的模块:点云配准

点云配准是点云相关的经典应用之一。配准的目的是估计两个点云之间位姿关系从而完成两者对应点之间的对齐/对应,因而在英文中又叫“align”、“correspondence”。笔者曾经是基于OpenCV进行三维重建的,并且从事过基于深度学习的6DoF位置估计等工作。在这些工作中,除了重建点…

Ansible的安装与配置

Ansible的安装与配置 1. 安装ansible # ansible是epel源提供的&#xff0c;所以必须安装epel&#xff1a; [rootRocky9 ~]# yum -y install epel-release Last metadata expiration check: 0:01:53 ago on Tue 26 Dec 2023 10:05:34 PM CST. Dependencies resolved. Package …

如何在 CentOS 上安装并配置 Redis

如何在 CentOS 上安装并配置 Redis 但是太阳&#xff0c;他每时每刻都是夕阳也都是旭日。当他熄灭着走下山去收尽苍凉残照之际&#xff0c;正是他在另一面燃烧着爬上山巅散烈烈朝晖之时。 ——史铁生 环境准备 本教程将在 CentOS 7 或 CentOS 8 上进行。确保你的系统已更新到最…

Java入门基础学习笔记7——Intellij IDEA开发工具概述、安装

之前的开发工具存在一些问题&#xff1a; 文本编辑工具&#xff1a;记事本、NotePad、EditPlus、Sublime...编写代码的时候没有错误提醒、没有智能代码提示、需要自己进行编译、执行、功能不够强大。 集成开发环境&#xff08;IDE&#xff1a;Integrated Development Environm…