std::money_put<CharT,OutputIt>:put, do_put
| Definiert in Header <locale> |
||
| public: iter_type put( iter_type out, bool intl, std::ios_base& f, |
(1) | |
| iter_type put( iter_type out, bool intl, std::ios_base& f, char_type fill, const string_type& quant ) const; |
(2) | |
| protected: virtual iter_type do_put( iter_type out, bool intl, std::ios_base& str, |
(3) | |
| virtual iter_type do_put( iter_type out, bool intl, std::ios_base& str, char_type fill, const string_type& digits ) const; |
(4) | |
Formatiert einen monetären Wert und schreibt das Ergebnis in den Ausgabestrom.
do_put der am weitesten abgeleiteten Klasse auf.Gegeben die Zeichensequenz aus den vorherigen Schritten, ruft es, wenn das erste Zeichen gleich ct.widen('-') ist, mp.neg_format() auf, um das Formatierungsmuster (pattern) zu erhalten, andernfalls ruft es mp.pos_format() auf, wobei mp die in str.getloc() eingebettete std::moneypunct<CharT, intl> Facette ist.
Tausender-Trennzeichen und Dezimalpunktzeichen werden gemäß mp.grouping(), mp.frac_digits(), mp.decimal_point() und mp.thousands_sep() eingefügt, und der resultierende String wird an der Stelle, an der value im Formatierungsmuster erscheint, in die Ausgabesequenz platziert.
Wenn str.flags() & str.showbase nicht Null ist (der Manipulator std::showbase wurde verwendet), dann wird das Währungssymbol oder der Währungsstring durch Aufrufen von mp.curr_symbol() generiert und an der Stelle, an der symbol im Formatierungsmuster erscheint, in die Ausgabesequenz platziert.
Wenn mp.positive_sign() (bei Verwendung des positiven Formatmusters) oder mp.negative_sign() (bei Verwendung des negativen Formatmusters) einen String mit mehr als einem Zeichen zurückgibt, wird das erste zurückgegebene Zeichen an der Stelle, an der sign im Formatierungsmuster erscheint, in die Ausgabesequenz platziert, und die restlichen Zeichen werden nach allen anderen Zeichen platziert. Zum Beispiel kann das Formatierungsmuster {sign, value, space, symbol} mit dem Wert 123 und "-" als negative_sign zu "-1.23 €" führen, während "()" als negative_sign "(1.23 €)" generieren würde.
Wenn die Anzahl der für das angegebene Format generierten Zeichen kleiner ist als der von str.width() zurückgegebene Wert, dann werden Kopien von fill eingefügt, um die Gesamtlänge der Ausgabesequenz auf genau str.width() zu bringen, wie folgt:
- Wenn str.flags() & str.adjustfield gleich str.internal ist, werden die Füllzeichen dort eingefügt, wo
noneoderspaceim Formatierungsmuster vorkommt. - Andernfalls, wenn str.flags() & str.adjustfield gleich str.left ist, werden die Kopien von fill nach allen anderen Zeichen angehängt.
- Andernfalls werden die Füllzeichen vor allen anderen Zeichen platziert.
Am Ende wird str.width(0) aufgerufen, um die Effekte von std::setw zu annullieren.
Inhalt |
[bearbeiten] Rückgabewert
Ein Iterator, der unmittelbar nach dem letzten erzeugten Zeichen zeigt.
[bearbeiten] Hinweise
Die Währungseinheiten werden als die kleinsten nicht-bruchteiligen Einheiten der Währung angenommen: Cents in den USA, Yen in Japan.
[bearbeiten] Beispiel
#include <iomanip> #include <iostream> #include <locale> struct my_punct : std::moneypunct_byname<char, false> { my_punct(const char* name) : moneypunct_byname(name) {} string_type do_negative_sign() const { return "()"; } }; int main() { std::locale loc("ru_RU.utf8"); std::cout.imbue(loc); long double units = -123.45; std::cout << "In Russian locale, " << units << " prints as " << std::showbase; // note, the following is equivalent to simply std::put_money(units) std::use_facet<std::money_put<char>>(loc).put( {std::cout}, false, std::cout, std::cout.fill(), units); std::cout << '\n'; std::cout.imbue(std::locale(std::cout.getloc(), new my_punct("ru_RU.utf8"))); std::cout << "With negative_sign set to \"()\", it prints as "; std::use_facet<std::money_put<char>>(loc).put( {std::cout}, false, std::cout, std::cout.fill(), units); std::cout << '\n'; }
Ausgabe
In Russian locale, -123,45 prints as -1.23 руб With negative_sign set to "()", it prints as (1.23 руб)
[bearbeiten] Defect Reports
Die folgenden Verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.
| DR | angewendet auf | Verhalten wie veröffentlicht | Korrigiertes Verhalten |
|---|---|---|---|
| LWG 328 | C++98 | Der für std::sprintf verwendete Formatstring war "%.01f" | korrigiert zu "%.0Lf" |
[bearbeiten] Siehe auch
| definiert Parameter für Geldformatierung, die von std::money_get und std::money_put verwendet werden (Klassentemplate) | |
| analysiert und konstruiert einen Geldbetrag aus einer Eingabezeichensequenz (Klassentemplate) | |
| (C++11) |
Formatiert und gibt einen Geldbetrag aus (Funktion-Template) |