2011-02-03 4 views
4
std::ostringstream oss; 
oss << std::setw(10); 
oss << std::setfill(' '); 
oss << std::setprecision(3); 
float value = .1; 
oss << value 

値が<であるかどうかを確認して先頭のゼロを見つけて削除できます。それほどエレガントではない。float1を.1としてストリーム化する方法

答えて

2

値が<であるかどうかを確認して先頭のゼロを見つけて削除できます。それほどエレガントではない。

は、合意されたが、それはあなたがの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; 
} 
+1

ああ、あなただけのcopyfmt' '行うことができます...私はあなたが何か新しい毎日:) 1 ...学ぶ推測 – Skurmedel

+0

わからないI(GRR、毎日投票の制限を。)なぜ私たちがcopyfmtをやっているのか理解していますが、もう少し調べてみましょう。ありがとう!私は私のoss変数をあなたのfloat_w/o ..関数に渡し、その後はそれを通常どおり使用し続けると仮定します。 – John

+1

@ user506225:フォーマットをコピーすると、精度とその他の関連するフラグがコピーされますが、期待される結果が得られるように、幅を除外(ここではゼロにリセット)する必要があります。そして、はい、あなたのストリームに渡して、最後の文字列を書き込むことができるようにしてから、あなたのストリームを通常どおり使用し続けます。 –

1

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; 
} 
関連する問題