OrtringStreamによって生成されたC ++文字列フィールドを切り捨てる、iOMANIP:setW

StackOverflow https://stackoverflow.com/questions/2900392

質問

C ++では、ゼロの先行ゼロを持つ整数の文字列表現が必要です。表現には8桁が8桁で8桁以下で、必要に応じて右側に数字が切り捨てられます。このように、OstringStreamとiomanip.setw()だけを使用してこれを行うことができると思いました。

int num_1 = 3000;
ostringstream out_target;

out_target << setw(8) << setfill('0') << num_1;
cout << "field: " << out_target.str() << " vs input: " << num_1 << endl;

ここの出力は次のとおりです。

field: 00003000 vs input: 3000

非常に素晴らしい!ただし、大量の数字を試してみると、SetWを8文字を超えて出力を成長させることができます。

int num_2 = 2000000000;
ostringstream out_target;

out_target << setw(8) << setfill('0') << num_2;
cout << "field: " << out_target.str() << " vs input: " << num_2 << endl;
out_target.str("");

出力:

field: 2000000000 vs input: 2000000000

目的の出力は「20000000」です。 2番目の操作を使用して最初の8文字のみを取ることを妨げるものは何もありませんが、フィールドトランケーションはiOnipから本当に欠落していますか?ブーストフォーマットは、1つのステップで必要なことを行いますか?

役に立ちましたか?

解決

そのような数値フィールドを切り捨てる方法は考えられません。おそらく、値が変更されるため実装されていないでしょう。

ostream::write() aを切り捨てることができます ストリング この例のように、単にバッファー...

    int num_2 = 2000000000;
    ostringstream out_target;

    out_target << setw(8) << setfill('0') << num_2;
    cout << "field: ";
    cout.write(out_target.str().c_str(), 8);
    cout << " vs input: " << num_2 << endl;

他のヒント

snprintf()ができるだけ多くのcharを書くことができると仮定した場合(これは保証されているとは思わない)、

char buf[9];
snprintf(buf, 10, "%08d", num);
buf[8] = 0;
cout << std::string(buf) << endl;

なぜ20億人が2000万人と同じであることを望んでいるのかわかりません。このように、切り捨てのエラーを示す方が理にかなっているかもしれません。

if (snprintf(buf, 10, "%08d", num) > 8) {
    throw std::exception("oops")
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top