在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格式化会一步完成我需要的吗?
答案 0 :(得分: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;
答案 1 :(得分: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")
}