c++ - 截断由 ostringstream、iomanip :setw 生成的 C++ 字符串字段

标签 c++ truncate ostringstream setw

在 C++ 中,我需要带有前导零的整数的字符串表示形式,其中表示形式有 8 位且不超过 8 位,如有必要,会截断右侧的数字。我想我可以只使用 ostringstream 和 iomanip.setw() 来做到这一点,如下所示:

int num_1 = 3000;
ostringstream out_target;

out_target << setw(8) << setfill('0') << num_1;
cout << "field: " << out_target.str() << " vs input: " << num_1 << endl;

这里的输出是:

field: 00003000 vs input: 3000

非常好!但是,如果我尝试更大的数字,setw 会让输出增长到超过 8 个字符:

int num_2 = 2000000000;
ostringstream out_target;

out_target << setw(8) << setfill('0') << num_2;
cout << "field: " << out_target.str() << " vs input: " << num_2 << endl;
out_target.str("");

输出:

field: 2000000000 vs input: 2000000000

所需的输出是“20000000”。没有什么可以阻止我使用第二个操作来仅获取前 8 个字符,但是 iomanip 真的缺少字段截断吗? Boost 格式化可以一步完成我所需要的吗?

最佳答案

我想不出任何方法来截断这样的数字字段。也许它还没有被实现,因为它会改变值。

ostream::write() 允许您足够简单地截断字符串缓冲区,如本例所示...

    int num_2 = 2000000000;
    ostringstream out_target;

    out_target << setw(8) << setfill('0') << num_2;
    cout << "field: ";
    cout.write(out_target.str().c_str(), 8);
    cout << " vs input: " << num_2 << endl;

关于c++ - 截断由 ostringstream、iomanip :setw 生成的 C++ 字符串字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2900392/

相关文章:

endpoint - 我需要有关在端点中实现截断选项的建议

c++ - 想要 ostringstream 修改传递的字符串

c++ - ostringstream 运算符<< 很长吗?

c++ - 什么是 C++ 临时对象?

vb6 - 如何在 VB6 中截断到特定的小数位数?

c++ - vector 类应该有什么构造函数/赋值运算符?

sql - 为什么 'delete from table' 需要 0 时间而 'truncate table' 需要很长时间?

c++ - 这是单例模式的正确实现吗?

C++如何从main调用派生基类函数