以下是我用來以有組織的表格形式顯示數據的各種功能,以及演示可能的使用場景的示例。
因爲這些函數使用stringstreams,所以它們不如其他解決方案那麼快,但對於我來說永不重要---計算瓶頸在別處。
使用stringstreams的一個優點是函數改變了它們自己的(內部作用域)字符串流的精度,而不是改變靜態cout的精度。因此,您無需擔心無意中修改精度,這種方式會持續影響代碼的其他部分。
顯示任意PRECISION
此prd
功能(以下簡稱 「打印雙」)簡單地打印具有指定的精度的雙精度值。
/* Convert double to string with specified number of places after the decimal. */
std::string prd(const double x, const int decDigits) {
stringstream ss;
ss << fixed;
ss.precision(decDigits); // set # places after decimal
ss << x;
return ss.str();
}
以下只是允許您指定數字左側的空格填充的變體。這可以在顯示錶格時有所幫助。
/* Convert double to string with specified number of places after the decimal
and left padding. */
std::string prd(const double x, const int decDigits, const int width) {
stringstream ss;
ss << fixed << right;
ss.fill(' '); // fill space around displayed #
ss.width(width); // set width around displayed #
ss.precision(decDigits); // set # places after decimal
ss << x;
return ss.str();
}
CENTER-ALIGN功能
這個函數簡單中心對齊文本,填充左,右有空格,直到返回的字符串是指定的寬度一樣大。
/*! Center-aligns string within a field of width w. Pads with blank spaces
to enforce alignment. */
std::string center(const string s, const int w) {
stringstream ss, spaces;
int padding = w - s.size(); // count excess room to pad
for(int i=0; i<padding/2; ++i)
spaces << " ";
ss << spaces.str() << s << spaces.str(); // format with padding
if(padding>0 && padding%2!=0) // if odd #, add 1 space
ss << " ";
return ss.str();
}
示例表格輸出的
所以,我們可以用以下方式使用prd
和center
以上功能輸出表。
代碼:
std::cout << center("x",10) << " | "
<< center("x^2",10) << " | "
<< center("(x^2)/8",10) << "\n";
std::cout << std::string(10*3 + 2*3, '-') << "\n";
for(double x=1.5; x<200; x +=x*2) {
std::cout << prd(x,1,10) << " | "
<< prd(x*x,2,10) << " | "
<< prd(x*x/8.0,4,10) << "\n";
}
將打印表格:
x | x^2 | (x^2)/8
------------------------------------
1.5 | 2.25 | 0.2812
4.5 | 20.25 | 2.5312
13.5 | 182.25 | 22.7812
40.5 | 1640.25 | 205.0312
121.5 | 14762.25 | 1845.2812
左手和ALIGN功能
,當然,你可以很容易地構建center
函數的變體,或左對齊並添加填充空格以填充所需的寬度。這裏有這樣的功能:
/* Right-aligns string within a field of width w. Pads with blank spaces
to enforce alignment. */
string right(const string s, const int w) {
stringstream ss, spaces;
int padding = w - s.size(); // count excess room to pad
for(int i=0; i<padding; ++i)
spaces << " ";
ss << spaces.str() << s; // format with padding
return ss.str();
}
/*! Left-aligns string within a field of width w. Pads with blank spaces
to enforce alignment. */
string left(const string s, const int w) {
stringstream ss, spaces;
int padding = w - s.size(); // count excess room to pad
for(int i=0; i<padding; ++i)
spaces << " ";
ss << s << spaces.str(); // format with padding
return ss.str();
}
我敢肯定有很多更優雅的方式做這樣的事情---肯定有更簡潔的方式。但這就是我所做的。適合我。
你應該可以用'setw'來做到這一點。你說你正在使用'setw',但你沒有說明如何。 – bames53