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を使用して、最初の2つを実行できますが、3番目を実行するにはどうすればよいですか?

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

3番目の値の前にはスペースが付いていますが、4番目の(負の)値にはスペースが付いていないことに注意してください。

4

4 に答える 4

6

次のようにsetfillとを使用できます。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 でこれを達成するには、次の 2 つの要素があります。

  1. std:: showpos正の値のインジケータを表示するために使用します。+もちろん、デフォルトでは、これは を使用します。
  2. を使って得られると思います。これをスペースに変えるには、ファセットがインストールされた を使用して、widenの要求にスペースで応答します。+std::use_facet<std::ctype<char> >(s.get_loc()).widen('+')std::localestd::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';
}

(コードはテストされておらず、おそらくエラーだらけです)。

于 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 に答える