ostream:前缀带空格的正数

时间:2012-10-04 13:54:09

标签: c++

在C中,空格可以包含在printf格式化标志中,这会导致正数以空格为前缀。这是用于对齐有符号值的有用功能。我无法弄清楚如何在C ++中做同样的事情。在C:

double d = 1.2;
printf("%f\n",d);
printf("%+f\n",d);
printf("% f\n",d);

产生

1.2
+1.2
 1.2

使用ostream,我可以做前两个,但我该如何做第三个?

int d = 1.2;
std::cout << d << std::endl;
std::cout << std::showpos << d << std::endl;
// ??????????????
编辑:关于我是否只想用空格为我的所有值加上前缀似乎有些混乱。我只想在值前加一个空格,类似于a),就像printf空格标志那样; b)类似于showpos所做的,除了空格而不是'+'。例如:

printf("%f\n", 1.2);
printf("%f\n", -1.2);
printf("% f\n", 1.2);
printf("% f\n", -1.2);

1.2
-1.2
 1.2
-1.2

请注意,第三个值以空格为前缀,而第四个(负数)值不是。

4 个答案:

答案 0 :(得分:6)

您可以使用setfillsetw,如下所示:

cout << setw(4) << setfill(' ') << 1.2 << endl;
cout << setw(4) << setfill(' ') << -1.2 << endl;

这会产生以下输出:

 1.2
-1.2

不要忘记包含<iomanip>以便编译(link to ideone)。

答案 1 :(得分:3)

我没有我的标准,而且我很少对这些事情充满信心:IOStreams实现这一目标有两个要素:

  1. 使用std:: showpos显示正值指示符。默认情况下,这将使用+
  2. 认为 +是使用std::use_facet<std::ctype<char> >(s.get_loc()).widen('+')获得的。要将其转换为空格,您只需使用安装了std::locale facet的std::ctype<char>,并为加宽 +的请求提供空格。
  3. 就是这样:

    struct my_ctype: std::ctype<char> {
        char do_widen(char c) const {
            return c == '+'? ' ': this->std::ctype<char>::do_widen(c);
        }
    };
    
    int main() {
        std::locale loc(std::locale(), new my_ctype);
        std::cout.imbue(loc);
        std::cout << std::showpos << 12.34 << '\n';
    }
    

    (代码未经过测试,可能存在错误)。

答案 2 :(得分:2)

怎么样

std::cout << (d >= 0 ? " ":"")  << d << std::endl;

答案 3 :(得分:1)

std::cout << " " << my_value;

如果您只需要积极的空间:

if (my_value >=0 ) cout << " "; cout << my_value;