2

C ++では、先行ゼロを含む整数の文字列表現が必要です。表現は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」です。最初の8文字だけを取得するために2番目の操作を使用することを妨げるものは何もありませんが、フィールドの切り捨てはiomanipから本当に欠落していますか?Boostフォーマットは必要なことを1つのステップで実行しますか?

4

2 に答える 2

2

そのような数値フィールドを切り捨てる方法は考えられません。値が変わるため、実装されていない可能性があります。

ostream::write()この例のように、文字列バッファを簡単に切り捨てることができます...

    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;
于 2010-05-24T21:49:46.130 に答える
1

snprintf()が可能な限り多くの文字を書き込むと仮定すると(これは保証されていないと思います)、

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")
}
于 2010-05-24T21:29:58.227 に答える