2

在 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 格式会一步完成我需要的吗?

4

2 回答 2

2

我想不出任何方法来截断这样的数字字段。也许它尚未实施,因为它会改变价值。

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;
于 2010-05-24T21:49:46.130 回答
1

如果您假设 snprintf() 将尽可能多地写入字符(我认为这不能保证),

char buf[9];
snprintf(buf, 10, "%08d", num);
buf[8] = 0;
cout << std::string(buf) << endl;

我不知道你为什么要 20 亿和 2000 万一样。在截断时发出错误信号可能更有意义,如下所示:

if (snprintf(buf, 10, "%08d", num) > 8) {
    throw std::exception("oops")
}
于 2010-05-24T21:29:58.227 回答