c++ - 如何使用 std::ostringstream 截断整型的宽度?

标签 c++ stl format width ostringstream

假设你有类似的东西:

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/

相关文章:

c++ - STL 友好的 pImpl 类?

java - Apache poi - 千位分隔符

string - Dart有sprintf,还是只有插值?

c++ - 使用内部链接定义的全局外部常量变量的类

c++ - 编译时间与运行时递归

c++ - 初学者对图像过滤的尝试

c++ - 我可以将使用 v120_xp 工具集构建的静态库链接到使用 VS2013 中的 v120 工具集构建的 EXE/DLL 吗?

c++ - 迭代器实现问题

c++ - end() 在 STL 容器中是如何实现的?

ruby-on-rails - `:location => ...`格式语句中的 `head :ok`和 'respond_to'是什么意思?