在iostream中切换不同的数字格式样式

时间:2014-03-24 22:39:26

标签: c++ iostream number-formatting scientific-notation

我有一个C ++程序将输出写入iostream,但我需要经常在不同的数字样式之间切换,例如科学与非科学之间。以下是我正在看的内容:

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    cout << setw(2) << 1 << ' ' << setw(4) << 0.25 << ' ';
    cout.width(6);
    cout.setf(ios::scientific, ios::floatfield);
    cout << 3.0 << ' ';
    cout.unsetf(ios::floatfield);
    cout << 4.0 << ' ';
    cout.setf(ios::scientific, ios::floatfield);
    cout << 3.0 << ' ';
    cout.unsetf(ios::floatfield);
    cout << 4.0 << endl;
    return 0;
}

这需要荒谬吗?看起来很糟糕。作为比较,这在C中看起来更加明智:

#include <stdio.h>

int main()
{
    printf("%2d %4g %6e %6g %6e %6g\n", 1, 0.25, 3.0, 4.0, 3.0, 4.0);
    return 0;
}

有没有办法在C ++中使用iostream以便于阅读?

2 个答案:

答案 0 :(得分:3)

这可能也有点矫枉过正,但你可以实现一些轻量级类型,为你做自定义格式

struct Scientific
{
  double value;
  Scientific(double value) : value(value) { } 
};

ostream& operator<< (ostream &o, const Scientific& p) {
  o.setf(ios::scientific, ios::floatfield);
  o << p.value;
  o.unsetf(ios::floatfield);
  return o;
}

然后可以将科学记数法指定为值的注释而不是多行

cout << 1 << ' ' << Scientific(2.0) << ' ' << endl;

答案 1 :(得分:0)

另一种方法可以是使用宏:

#include <iostream>
#include <iomanip>

using std::hex;
using std::scientific;
using std::cout;
using std::endl;

define H hex
define S scientific

int main(int argc, char **argv) {
  cout << H << 10 << S << 10 << endl;

  return 0;
}