【发布时间】:2010-12-15 20:11:50
【问题描述】:
假设你有类似的东西:
std::ostringstream oss;
int value(42);
oss.fill('0');
oss << std::setw(3) << value;
cout << oss.str();
输出:042
这个输出是因为 std::setw 确保了最小宽度,我们告诉流填充 0 但是你如何做相反的事情并指定最大宽度,以便在 STL 和原生 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 进行格式化?
【问题讨论】:
-
"123"是123和1239999的正确表示到底怎么可能是正确的?如果这是真的,我认为你根本就没有整数。 -
这是一个脱离上下文的简单表示,以使问题清晰......在实际使用中,该值表示 posix 时间对象的小数秒,该对象被记录为不准确条目的时间戳的一部分在大多数操作系统上超过 3 位数,浪费空间,并使日志更难阅读。
标签: c++ stl format width ostringstream