以下是我用来以有组织的表格形式显示数据的各种函数,以及一个演示可能使用场景的示例。
因为这些函数使用字符串流,所以它们没有其他解决方案那么快,但对我来说这并不重要——计算瓶颈在别处。
使用字符串流的一个优点是函数会改变它们自己(内部范围)字符串流的精度,而不是改变静态 cout 精度。因此,您永远不必担心无意中修改精度会持续影响代码的其他部分。
显示任意精度
这个prd
函数(“print double”的缩写)简单地打印一个具有指定精度的双精度值。
/* 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-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
andcenter
函数以下列方式输出表格。
编码:
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
右对齐和左对齐功能
而且,当然,您可以轻松地构造函数的变体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();
}
我敢肯定有很多更优雅的方式来做这种事情——当然还有更简洁的方式。但这就是我所做的。对我来说效果很好。