IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> C++漫游记 (4):C++千分位数的格式化 -> 正文阅读

[C++知识库]C++漫游记 (4):C++千分位数的格式化

在C++中,对千分位数的格式化,可以使用计算方式,但是比较繁琐,而且涉及到多种类型,更是麻烦。这里介绍一种基于***ios_base***类的方法。

以double类型为例:

#include <iostream>
#include <string>
#include <sstream>
#include <iomanip>
#include <locale>

std::string to_thousands(double value)
{
    std::stringstream sstream;
    sstream.imbue(std::locale(""));
    sstream << std::setprecision(2) << std::fixed << value;
    return sstream.str();
}

int main()
{
    std::cout << to_thousands(1234.567) << std::endl;    // 输出:1,234.57
    return 0;
}

函数释义:

1. std::stringstream sstream;
创建一个流对象,提供数据输入输出。

2. sstream.imbue(std::locale(""));
更改流的区域设置***(loacle)***,进行千分位数据的格式化。这里的locale是未命名的,使用默认处理。

3. sstream << std::setprecision(2) << std::fixed << std::showpos << value;
(1)std::setprecision(2),设置小数点位数为2位,也可以独立一行:sstream.precision(2)
(2)std::fixed,浮点数按指定的小数点完整显示,否则会默认按***std::scientific***处理,用科学计数法显示浮点数

4. return sstream.str()
提取流中的文本。


由于数值类型较多,这里通过模板函数进行封装:

template<typename T>
std::string to_thousands(T value, int dec = 0)
{
    std::stringstream sstream;
    sstream.imbue(std::locale(""));
    sstream.precision(dec);
    sstream << std::fixed << value;
    return sstream.str();
}

参数1为需要格式化的数值,参数2为指定的小数点位数(供浮点数使用),现在可以适配多种类型的数值(int、long、float、double等等),示例:

    int n1 = 1000;
    to_thousands(n1);      // int

    long n2 = 1000;
    to_thousands(n2);      // int

    float f1 = 1000.123;
    to_thousands(f1, 2);   // float

    double d1 = 1000.123;
    to_thousands(d1, 2);   // double

需要注意的是,当参数1是整数时,指定小数点数无效。如果需要对整数也指定小数位数,在函数第1行对数值进行乘1.0,全部按浮点数进行处理。

template<typename T>
std::string to_thousands(T value, int dec = 0)
{
    value *= 1.0; // 统一按浮点数处理,整数也支持指定小数位数
    std::stringstream sstream;
    sstream.imbue(std::locale(""));
    sstream.precision(dec);
    sstream << std::fixed << value;
    return sstream.str();
}

另外,如果需要对正数显示“+”,指定***std::showpos***即可

sstream << std::fixed << std::showpos << value;
  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2022-03-11 21:57:07  更:2022-03-11 21:58:40 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 4:32:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码