Выровнять десятичные знаки в выводе? - PullRequest
0 голосов
/ 17 января 2019
#include <iomanip>
#include <cmath>
#include <iostream>
using namespace std;


int main() {
    //
    //HERE IS THE ISSUE
    //set precision to 3 decimals
    cout<<fixed;
    //printing the final pressure of the gas
    cout <<setw(20)<<left<<setfill('.')<<"Equation #01"<<"Ideal Gas Law(Chemistry): "<<setw(5)<<setprecision(3)<<gaslawPressure<<" atm" 
<<endl;

    //printing the calculated distance
    cout <<setw(20)<<left<<setfill('.')<<"Equation #02"<<"Distance Formula(Math): "<<setw(5)<<setprecision(3)<<pointDistance<<endl;
    return 0;
}

Вывод данных:

Equation #01........Ideal Gas Law(Chemistry): 1.641 atm
Equation #02........Distance Formula(Math): 30.017

Требуется вывод:

Equation #01........Ideal Gas Law(Chemistry):    1.641 atm
Equation #02........Distance Formula(Math)  :   30.017

Мне также нужно выровнять двоеточия как таковые.

Ответы [ 3 ]

0 голосов
/ 17 января 2019

Насколько я знаю, нет быстрого способа сделать это с помощью isstream / iomanip

Точность определяет не длину дробной части, а количество всех цифр.

Я понимаю, вам нужно правильно дополнить значения. В этом случае решение является sprintf из [cstdio]. Это должно выглядеть примерно так:

sprintf (YourBuffer, "% 10.3f", YourVariable);

https://en.cppreference.com/w/cpp/io/c/fprintf

http://www.cplusplus.com/reference/cstdio/printf/ - короткая версия

0 голосов
/ 17 января 2019

ОБНОВЛЕНИЕ: Как я видел, вы не хотели, чтобы выравнивалось только второе поле. Но если вы жестко разбираете поля, вы можете отформатировать их самостоятельно. Если они передаются вам как строки, они могут обрабатываться так же, как ваши двойники.

Поскольку вы хотите выровнять десятичные точки на результатах, вы должны сделать это самостоятельно из того, что я понимаю. Вспомогательная структура защищает его от повторного использования.

    #include <iomanip>
    #include <cmath>
    #include <iostream>

    struct buf
    {
        double val;
        buf(double val) :val(val) {}
        friend std::ostream& operator<< (std::ostream& os, buf b) {
            for (double i = b.val; i < 1000; i*=10) os << " ";
            return os << b.val;
        }
    };

int main() {
    //
    double gaslawPressure = 1.615;
    double pointDistance = 221.615;
    std::cout << std::setw(20) << std::left << std::setfill('.')
        << "Equation #01" << "Ideal Gas Law(Chemistry) : " << buf(gaslawPressure)<<" atm" << std::endl;

    //printing the calculated distance
    std::cout << std::setw(20) << std::left << std::setfill('.')
        << "Equation #02" << "Distance Formula(Math)   : "<< buf(pointDistance)<< std::endl;

        return 0;
}

Выход:

Equation #01........Ideal Gas Law(Chemistry) :    1.615 atm
Equation #02........Distance Formula(Math)   :  221.615
0 голосов
/ 17 января 2019

Вам нужно будет поставить правильные настройки в разных частях, а также выравнивание по левому краю на основе вашего текста

1) Первая часть

setw(20)<<left<<setfill('.')<<"Equation #01" 

2) Вторая часть - приблизительно 30

.
setw(30)<<left<<setfill(' ')<<"Ideal Gas Law(Chemistry)"

3) Чтобы выровнять двоеточие:

setw(3)<<left<<setfill(' ')<<":"

4) значение части

setw(5)<<std::left<<setprecision(3)<<gaslawPressure<<" atm"



#include <iomanip>
#include <cmath>
#include <iostream>
using namespace std;


int main() {
    //
    //HERE IS THE ISSUE
    //set precision to 3 decimals
    auto gaslawPressure = 1.641;
    auto pointDistance = 30.017;

    cout<<fixed;
    //printing the final pressure of the gas
    cout <<setw(20)<<left<<setfill('.')<<"Equation #01"<<setw(30)<<left<<setfill(' ')<<"Ideal Gas Law(Chemistry)"<<setw(3)<<left<<setfill(' ')<<":"<<setw(5)<<std::left<<setprecision(3)<<gaslawPressure<<" atm"<<endl;

    //printing the calculated distance
    cout <<std::left<<setw(20)<<left<<setfill('.')<<"Equation #02"<<setw(30)<<left<<setfill(' ')<<"Distance Formula(Math)"<<setw(3)<<left<<setfill(' ')<<":"<<setw(5)<<setprecision(3)<<pointDistance<<endl;
    return 0;
}

выход

Equation #01........Ideal Gas Law(Chemistry)      :  1.641 atm
Equation #02........Distance Formula(Math)        :  30.017
Program ended with exit code: 0
...