Namensräume
Varianten
Aktionen

std::money_put<CharT,OutputIt>:put, do_put

Von cppreference.com
< cpp‎ | locale‎ | money put
 
 
 
 
std::money_put
Memberfunktionen
money_put::putmoney_put::do_put
 
Definiert in Header <locale>
public:

iter_type put( iter_type out, bool intl, std::ios_base& f,

               char_type fill, long double quant ) const;
(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,

                          char_type fill, long double units ) const;
(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.

1,2) Öffentliche Memberfunktionen rufen die Memberfunktion do_put der am weitesten abgeleiteten Klasse auf.
3) Das numerische Argument units wird in einen Wide-Character-String konvertiert, als ob durch ct.widen(buf1, buf1 + std::sprintf(buf1, "%.0Lf", units), buf2), wobei ct die in str.getloc() eingebettete std::ctype Facette ist und buf1 und buf2 ausreichend große Zeichenpuffer sind. Der resultierende Zeichenstring buf2 wird verarbeitet, formatiert und wie unten beschrieben nach out ausgegeben.
4) Aus dem String-Argument digits werden nur das optionale führende Minuszeichen (bestimmt durch Vergleich mit ct.widen('-'), wobei ct die in str.getloc() eingebettete std::ctype Facette ist) und die unmittelbar folgenden Ziffernzeichen (klassifiziert durch ct) als Zeichensequenz genommen, die wie unten beschrieben verarbeitet, formatiert und nach out ausgegeben wird.

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 none oder space im 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) [bearbeiten]
analysiert und konstruiert einen Geldbetrag aus einer Eingabezeichensequenz
(Klassentemplate) [bearbeiten]
(C++11)
Formatiert und gibt einen Geldbetrag aus
(Funktion-Template) [bearbeiten]