OrtringStreamによって生成されたC ++文字列フィールドを切り捨てる、iOMANIP:setW
-
04-10-2019 - |
質問
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")
}
所属していません StackOverflow