Home > Blockchain >  How to guarantee that std::cout always uses n width
How to guarantee that std::cout always uses n width

Time:11-02

I have output that looks like this:

BTC-USDT              [FTX] 20460.91 20470.09
BTC-USDT              [BINANCE_US] 20457.34 20467.28 
BTC-USDT              [BINANCE_US] 20457.50 20467.28

I would like it to look like this:

BTC-USDT  [       FTX] 20460.91 20470.09 
BTC-USDT  [BINANCE_US] 20457.34 20467.28
BTC-USDT  [BINANCE_US] 20457.50 20467.28

I think I am close with this code, but I am confused by setw()

std::cout << pair << std::setfill(' ') << std::setw(15) << " [" << exch << "] " << fixed << setprecision(2) <<  bid << " " << ask << std::endl;

CodePudding user response:

As noted in comments, iomanip settings need to be applied before the item they are meant to apply to.

Filling in values for the missing variables from your example:

#include <iomanip>
#include <iostream>

int main() {
  std::cout << "Foo " << "[" 
            << std::setfill(' ') << std::setw(15)
            << "Bar" << "] " 
            << std::fixed << std::setprecision(2) <<  20.897
            << " " << 1.4566 << std::endl;

  return 0;
}

Output:

Foo [            Bar] 20.90 1.46

CodePudding user response:

If you want a given value to have certain output characteristics, like width, alignment, etc, you need to apply the appropriate I/O manipulator(s) before you output the value, not after.

In your example, you want pair to be left-aligned with a width of 9, and exch to be right-aligned with a with of 10, so apply std::setw and std::left/std::right accordingly, eg:

std::cout << std::setfill(' ')
          << std::setw(9) << std::left << pair
          << " [" << std::setw(10) << std::right << exch << "] "
          << std::fixed << std::setprecision(2) << bid << ' ' << ask
          << std::endl;

Output:

BTC-USDT  [       FTX] 20460.91 20470.09
BTC-USDT  [BINANCE_US] 20457.34 20467.28
BTC-USDT  [BINANCE_US] 20457.50 20467.28

Online Demo

  • Related