在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
请注意,第三个值以空格为前缀,而第四个(负数)值不是。
答案 0 :(得分:6)
您可以使用setfill
和setw
,如下所示:
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实现这一目标有两个要素:
std:: showpos
显示正值指示符。默认情况下,这将使用+
。+
是使用std::use_facet<std::ctype<char> >(s.get_loc()).widen('+')
获得的。要将其转换为空格,您只需使用安装了std::locale
facet的std::ctype<char>
,并为加宽 +
的请求提供空格。就是这样:
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;