7

在 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

4 回答 4

6

您可以使用setfilland setw,如下所示:

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

这会产生以下输出:

 1.2
-1.2

不要忘记包含<iomanip>以便编译(指向 ideone 的链接)。

于 2012-10-04T14:01:36.023 回答
3

我没有自己的标准,而且我做这些事情的次数太少以至于无法对此充满信心:使用 IOStreams 实现这一目标有两个要素:

  1. 用于std:: showpos显示正值指示符。当然,默认情况下这将使用+
  2. 认为+使用std::use_facet<std::ctype<char> >(s.get_loc()).widen('+'). 要将其转换为空间,您只需使用安装std::localestd::ctype<char>facet 的 a 以响应要加宽 +的请求的空间。

也就是说,像这样:

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';
}

(代码未经测试,可能充满错误)。

于 2012-10-04T14:22:09.483 回答
2

怎么样

std::cout << (d >= 0 ? " ":"")  << d << std::endl;
于 2012-10-04T14:00:10.353 回答
1
std::cout << " " << my_value;

如果您只需要正面的空间:

if (my_value >=0 ) cout << " "; cout << my_value;
于 2012-10-04T13:54:57.720 回答