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

我可以检查值是否为< 1然后找到前导零并将其删除。不是很优雅。如何将float .1设置为.1而不是0.1

回答

2

我可以检查是否值< 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; 
} 
+1

哦,你可能只是做`copyfmt` ...我想你每天学习:) +1一些新的东西... – Skurmedel 2011-02-03 17:33:47

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; 
} 
相关问题