std::ostringstream oss;
oss << std::setw(10);
oss << std::setfill(' ');
oss << std::setprecision(3);
float value = .1;
oss << value
値が<であるかどうかを確認して先頭のゼロを見つけて削除できます。それほどエレガントではない。float1を.1としてストリーム化する方法
std::ostringstream oss;
oss << std::setw(10);
oss << std::setfill(' ');
oss << std::setprecision(3);
float value = .1;
oss << value
値が<であるかどうかを確認して先頭のゼロを見つけて削除できます。それほどエレガントではない。float1を.1としてストリーム化する方法
値が<であるかどうかを確認して先頭のゼロを見つけて削除できます。それほどエレガントではない。
は、合意されたが、それはあなたがのostreamの独自のバージョン::演算子< <(フロート)を定義するためのロケールで周りいじくることなく、しなければならないものです。 (あなたはこれを回避したくありません。)
void float_without_leading_zero(float x, std::ostream &out) {
std::ostringstream ss;
ss.copyfmt(out);
ss.width(0);
ss << x;
std::string s = ss.str();
if (s.size() > 1 && s[0] == '0') {
s.erase(0);
}
out << s;
}
write your own manipulatorです。優雅さはもちろん議論の余地があります。それは多かれ少なかれあなたがすべての準備ができているものだ。
例:
struct myfloat
{
myfloat(float n) : _n(n) {}
float n() const { return _n; }
private:
float _n;
};
std::ostream &<<(std::ostream &out, myfloat mf)
{
if (mf.n() < 0f)
{
// Efficiency of this is solution is questionable :)
std::ios_base::fmtflags flags = out.flags();
std::ostringstream convert;
convert.flags(flags);
convert << mf.n();
std::string result;
convert >> result;
if (result.length() > 1)
return out << result.substr(1);
else
return out << result;
}
return out;
}
ああ、あなただけのcopyfmt' '行うことができます...私はあなたが何か新しい毎日:) 1 ...学ぶ推測 – Skurmedel
わからないI(GRR、毎日投票の制限を。)なぜ私たちがcopyfmtをやっているのか理解していますが、もう少し調べてみましょう。ありがとう!私は私のoss変数をあなたのfloat_w/o ..関数に渡し、その後はそれを通常どおり使用し続けると仮定します。 – John
@ user506225:フォーマットをコピーすると、精度とその他の関連するフラグがコピーされますが、期待される結果が得られるように、幅を除外(ここではゼロにリセット)する必要があります。そして、はい、あなたのストリームに渡して、最後の文字列を書き込むことができるようにしてから、あなたのストリームを通常どおり使用し続けます。 –