假设你有类似的东西:
std::ostringstream oss;
int value(42);
oss.fill('0');
oss << std::setw(3) << value;
cout << oss.str();
输出:042
此输出是因为 std::setw 确保最小宽度,并且我们告诉流用 0 填充,但是如何执行相反的操作并指定最大宽度,以便在 STL 和 native C++ 中最好将显示截断。 .
目前我有一些我认为是丑陋且低效的黑客:
std::ostringstream oss;
int value(1239999);
oss.fill('0');
oss << std::setw(3) << boost::lexical_cast<std::string, int>(value).substr(0, 3);
cout << oss.str();
输出:123
我看过 boost::format 但据我所知,这是同样的故事,没有办法“漂亮地”做到这一点......有什么建议吗?
更新:与 STL 的其他容器和模板对象相比,std::ostringstream 和 STL 流通常执行速度较慢。也许我最好创建一个消息队列对象,它包装并在内部使用 std::queue,然后仅使用 sprintf_s 进行格式化?
最佳答案
大多数现代程序员都“不赞成”截断以删除有效数字。在 FORTRAN 格式化的糟糕日子里,得到像这样的输出是很常见的
Total Sales
-----------
9,314,832.36
1,700,328.04
*,***,***,**
8,314,159.26
...
即使是现代的 Excel 也会陷入这个陷阱,其字段宽度溢出指示为 ########
如果输出的数字不适合字段宽度,当前的理念是打破字段宽度的界限并可靠地显示该值。唯一的缺点是 FORTRAN 程序要读取输入(因此需要严格的列使用)。
关于c++ - 如何使用 std::ostringstream 截断整型的宽度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4454406/