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