在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;
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);
long n2 = 1000;
to_thousands(n2);
float f1 = 1000.123;
to_thousands(f1, 2);
double d1 = 1000.123;
to_thousands(d1, 2);
需要注意的是,当参数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;
|