我想将double转换为固定宽度的字符串。
如果宽度为10,那么我希望double值可以达到此宽度。
例如,如果value = 102.121323435345且宽度为10,则此值应为
position==> 0123456789 value = 102.121323
我可以使用snprintf实现这一点,但我正在寻找一个c ++本机代码来做同样的事情。
char buf[125];
snprint(buf, width, "%.6f", value);
我尝试使用下面的内容,但它对我没什么帮助,
std::ostringstream oss;
oss << std::fixed << std::setw(10) << std::precision(6) << value;
std :: setw保证值的最小宽度,如果值大于宽度大小,则不会将值四舍五入。
感谢。
答案 0 :(得分:3)
您可以使用osteram::width和ostream::precision功能来实现您的目标,例如
std::ostringstream out;
out.width(10);
out.precision(10);
out << 123.12345678910111213;
虽然它不会在点之后添加零以便尊重宽度,但它会在数字之前添加空格(或您选择的任何字符)。所以你得到'102'或'0000000102'(如果你调出out.fill('0');)而不是'102.000000'如果你传递102作为输入值。
答案 1 :(得分:2)
词汇演员怎么样?
double x = 102.1213239999;
std::cout << boost::lexical_cast<std::string>(x).substr(0,10);
这不完全是你所要求的。我只是想在盒子外思考 您可能还想查看此问题,以便对格式differences between C and C++进行讨论并查看Boost Format Library
答案 2 :(得分:1)
这就是你想要的吗?在这里,我们计算可用精度的数量并相应地设置ostream。
#include <iostream>
#include <iomanip>
using namespace std;
int main(int argc, char* argv[])
{
// Input
double value = 102.1213239999;
// Calculate limits
int digits = ( (value<1) ? 1 : int(1+log10(double(abs(value)))) );
int width = 10;
int precision = (((width-digits-1)>=0) ? (width-digits-1):0);
// Display
cout.setf(ios::fixed);
cout.precision(precision);
cout<<setw(10)<<value<<endl;
return 0;
}
OUTPUT: 102.121324
顺便说一句,如果您想要一卡车的方法来计算数字,here's how.
答案 3 :(得分:0)
int main() {
double x=3.543732;
cout << to_string(x).substr(0,5);
return 0;
}