双打格式化输出

时间:2014-06-05 16:37:23

标签: c++ output

我想知道如何在c ++中将例如10打印为10.0000,或将10.1打印为10.1000。 我希望总位数相同,并使用' 0'右边的空白区域。 我读到了' setprecision',但它没有添加' 0'。 '固定'是浮点后的位数,我希望修改总位数。 有没有办法做到这一点,而不是使用printf?

2 个答案:

答案 0 :(得分:0)

你可以做这样的事情:(考虑到你想要一个固定的长度为5)

int precision(double num){
    int p;
    if (num <1)
        p = 5;
    else if (num <10)
        p = 4;
    else if (num <100)
        p = 3;
    else if (num <1000)
        p = 2;
    else if (num <10000)
        p = 1;
    else
        p = 0;
    return p;
}

int main(){
    double num;
    std::cin>>num;
    std::cout <<std::fixed <<std::setprecision(precision(num)) << num <<std::endl;
    return 0;
}

根据您的要求,如果 After decimal的位数大于5,则会被截断。

现在,如果小数点之前的位数超过5位数,则为您想要做的事情实现自己的逻辑。)

答案 1 :(得分:0)

您最终需要找出双倍数字的长度。我并不完全确定如何以安全的方式解决这个问题,但幸运的是,我可以向您展示一个我们可以用整数来做这个的例子。

基本上我建议创建一个新的facet类来实现do_put()中的自定义格式。然后将这个课程灌输到你的流中。下面的完全相同的事情可以用于do_put()的重载,它将double作为其最后一个参数,并对for循环进行一些更改。

#include <iostream>
#include <iomanip>

class num_put : public std::num_put<char>
{
    iter_type do_put( iter_type out, std::ios_base& str, char, long v ) const
    {
        std::streamsize width = str.width();
        int             digits = num_digits(v);

        if (digits > width)
            for (std::streamsize i(0); i < digits - width; ++i)
                v /= 10;
            /*  v = static_cast<int>(v * 10) / 10.; // use this instead for
            */                                      // floating-point

        str.flags(std::ios_base::left);
        out = std::num_put<char>::do_put(out, str, '0', v);

        str.width(width);
        return out;
    }
private:
    template<class T>
    static int num_digits(T num) // only works for integral types
    {
        int length = 1;
        while (num /= 10)
            ++length;
        return length;
    }
};

int main()
{
    std::cout.imbue(std::locale(std::cout.getloc(), new num_put));

    std::cout << std::setw(5) << 123;       // 12300
    std::cout << std::setw(5) << 123456789; // 12345
}