setw() 和 setfill() 不工作...我做错了什么?

setw() and setfill() not working...what am i doing wrong?

我想做的是打印 double 数据类型,精度为 2setw(15),用 _(下划线) 前缀 - 或 + 填充空格。例如,如果 数字是 2006.008 output 应该是 _______+2006.01

我的代码是:

 cin>>b;
if(b>0){
    cout<<setw(15)<<setfill('_');
    cout<<fixed<<setprecision(2)<<"+"<<b<<endl;
}
else{
    cout<<setw(15)<<setfill('_');
    cout<<fixed<<setprecision(2)<<"-"<<b<<endl;
}

我得到的输出是: ______________+2006.01

区别: 我的输出有 14 个下划线

但结果应该只有 7 个下划线

我尝试了什么?

没有前缀我的答案是准确的,因为如果我添加前缀 setw(15) 会将我的前缀计为第 15 个字符并在它之前添加 14 个下划线

使用 std::showpos 而不是输出字符串文字 "+""-".

cout<<setw(15)<<setfill('_');
cout<<fixed<<setprecision(2)<<std::showpos<<b<<endl;

否则 std::setw 设置字符串文字的字段宽度 "+""-".

io-manipulators 适用于对流的单次插入。当你插入 "+" 到流中,那么它的宽度是 1 而剩下的 14_ 填充,因为 setfill('_').

如果您希望 io-manipulators 应用于连接的字符串,您可以连接这些字符串。我在这里使用了一个stringstream,所以你可以应用setprecisionfixed:

if(b>0){
    std::stringstream ss;
    ss << "+" << fixed << setprecision(2) << b;
    cout << setw(15) << setfill('_') << s.str() << endl;