将double转换为具有固定宽度的String

时间:2009-09-30 04:50:58

标签: c++ string-formatting

我想将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保证值的最小宽度,如果值大于宽度大小,则不会将值四舍五入。

感谢。

4 个答案:

答案 0 :(得分:3)

您可以使用osteram::widthostream::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;
}