4 Stimmen

Wie streamt man Float .1 als .1 und nicht 0.1

std::ostringstream oss;
oss << std::setw(10);
oss << std::setfill(' ');
oss << std::setprecision(3);
float value = .1;
oss << value

Ich kann prüfen, ob der Wert < 1 ist, und dann die führende Null finden und sie entfernen. Nicht sehr elegant.

2voto

Fred Nurk Punkte 13458

Ich kann prüfen, ob der Wert < 1 ist, und dann die führende Null finden und sie entfernen. Nicht sehr elegant.

Einverstanden, aber das ist es, was Sie tun müssen, ohne in Locales herumzuwühlen, um Ihre eigene Version von ostream::operator<<(float) zu definieren. (Dieses Herumwurschteln wollen Sie nicht machen.)

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

1voto

Skurmedel Punkte 20549

Sie könnten einen eigenen Manipulator schreiben . Über die Eleganz lässt sich natürlich streiten. Es wäre aber mehr oder weniger das, was Sie schon vorgeschlagen haben.

Beispiel:

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

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X