Как стрим плавать .1 как .1, а не 0.1 - PullRequest
4 голосов
/ 03 февраля 2011
std::ostringstream oss;
oss << std::setw(10);
oss << std::setfill(' ');
oss << std::setprecision(3);
float value = .1;
oss << value

Я могу проверить, если значение <1, а затем найти ведущий ноль и удалить его.Не очень элегантно. </p>

Ответы [ 2 ]

2 голосов
/ 03 февраля 2011

Я могу проверить, если значение <1, а затем найти ведущий ноль и удалить его. Не очень элегантно. </p>

Согласен, но это то, что вам нужно сделать, не осматривая локали, чтобы определить собственную версию ostream :: operator << (float). (Вы не хотите заниматься этим.) </p>

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 голос
/ 03 февраля 2011

Вы можете написать свой собственный манипулятор .Элегантность, конечно, спорна.Хотя это будет более или менее то, что вы все готовы.

Пример:

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;
}
...