Namespaces
Variants

std::money_get<CharT,InputIt>:: get, do_get

From cppreference.net
std::money_get
Member functions
money_get::get money_get::do_get
Definiert im Header <locale>
public :

iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(1)
iter_type get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(2)
protected :

virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,

std:: ios_base :: iostate & err, long double & units ) const ;
(3)
virtual iter_type do_get ( iter_type beg, iter_type end, bool intl, std:: ios_base & str,
std:: ios_base :: iostate & err, string_type & digits ) const ;
(4)

Parst einen monetären Wert aus einem Eingabeiterator und schreibt das Ergebnis in einen long double oder String.

1,2) Öffentliche Memberfunktionen, rufen die Memberfunktion do_get der am stärksten abgeleiteten Klasse auf.
3,4) Liest Zeichen vom Eingabe-Iterator beg und erwartet, einen Geldwert zu finden, der gemäß den Regeln formatiert ist, die durch die std:: ctype -Facette festgelegt sind, die in str. getloc ( ) eingebunden ist ( ct für den Rest dieser Seite), die std:: moneypunct < CharT, intl > -Facette, die in str. getloc ( ) eingebunden ist ( mp für den Rest dieser Seite), und die Stream-Formatierungsflags, die von str. flags ( ) abgerufen wurden.

Wenn der Eingabe-Iterator beg gleich end wird, bevor das Parsing abgeschlossen ist, werden sowohl failbit als auch eofbit in err gesetzt. Wenn das Parsing aus einem anderen Grund fehlschlägt, wird das failbit in err gesetzt. In beiden Fällen wird der Ausgabeparameter ( units oder digits ) bei einem Fehler nicht modifiziert.

Wenn das Parsen erfolgreich ist, ändert es err nicht und speichert das Ergebnis in units oder digits .

Das Formatierungsmuster, pattern das von dieser Funktion verwendet wird, ist immer mp. neg_format ( ) .

Wenn mp. grouping ( ) Tausendertrennzeichen nicht erlaubt, wird das erste gefundene Trennzeichen als Parsing-Fehler behandelt, andernfalls werden sie als optional betrachtet.

Wenn money_base::space oder money_base::none das letzte Element im pattern ist, versucht der Parser nicht, nach dem Parsen der anderen Komponenten des Geldwerts Leerzeichen zu konsumieren. Andernfalls werden ein oder mehrere Leerzeichen konsumiert, wo money_base::space erscheint.

Wenn das showbase -Flag in str. flags ( ) gesetzt ist, ist das Währungssymbol oder die Währungszeichenkette erforderlich; wenn es nicht gesetzt ist, ist das Währungssymbol optional.

Wenn das erste Zeichen der von mp. positive_sign ( ) oder mp. negative_sign ( ) zurückgegebenen Zeichenkette in der money_base::sign Position des Formatierungsmusters gefunden wird, wird es konsumiert, und die restlichen Zeichen dieser Zeichenkette werden nach allen anderen Komponenten des Geldwerts erwartet und konsumiert. Wenn sowohl mp. positive_sign ( ) als auch mp. negative_sign ( ) nicht leer sind, ist das Vorzeichen erforderlich und muss mit dem ersten Zeichen einer dieser Zeichenketten übereinstimmen. Wenn eine dieser Zeichenketten leer ist, ist das Vorzeichen optional (und wenn es fehlt, entspricht das Vorzeichen des Ergebnisses der Zeichenkette, die leer war). Wenn beide Zeichenketten leer sind oder das gleiche erste Zeichen haben, erhält das Ergebnis ein positives Vorzeichen. Wenn der Ausgabeparameter eine Zeichenkette ist ( digits ) und das Ergebnis negativ ist, wird der Wert ct. widen ( '-' ) als erstes Zeichen des Ergebnisses gespeichert.

Die Ziffern aus der Eingabe werden in der Reihenfolge extrahiert, in der sie erscheinen, und in digits platziert (nach erforderlicher Erweiterung durch ct. widen ( ) ), oder in einen temporären Puffer buf1 , aus dem der Wert von units konstruiert wird, als ob durch

static const char src[] = "0123456789-";
CharT atoms[sizeof(src)];
ct.widen(src, src + sizeof(src) - 1, atoms);
for (int i = 0; i < n; ++i)
buf2[i] = src[find(atoms, atoms+sizeof(src), buf1[i]) - atoms];
buf2[n] = 0;
sscanf(buf2, "%Lf", &units);

(wobei n die Anzahl der aus der Eingabe extrahierten und in buf1 gespeicherten Zeichen ist und buf2 ein weiterer ausreichend großer Zeichenpuffer ist).

Inhaltsverzeichnis

Rückgabewert

Ein Iterator, der unmittelbar auf das letzte Zeichen zeigt, das als gültiger Teil der monetären Zeichenkette-Eingabe erkannt wurde.

Hinweise

Die Währungseinheiten werden als die kleinsten nicht-bruchzahligen Einheiten der Währung angenommen: Cent in den USA, Yen in Japan. Somit erzeugt die Eingabesequenz "$1,056.23" in einem US-Lokale die Zahl 105623.0 in units oder einen String "105623" in digits .

Da das Währungssymbol optional ist, wenn showbase ausgeschaltet ist, aber das gesamte mehrzeilige negative_sign() erforderlich ist, ergibt sich für das Formatierungsmuster { sign, value, space, symbol } mit showbase ausgeschaltet und negative_sign von "-" , dass der String "-1.23 €" als - 123 geparst wird und "€" unverbraucht im Eingabestrom verbleibt. Wenn jedoch negative_sign "()" ist, wird der String "(1.23 €)" vollständig verarbeitet.

Der I/O-Manipulator std::get_money bietet eine einfachere Schnittstelle zu dieser Funktion.

Beispiel

#include <iostream>
#include <locale>
#include <sstream>
void demo_money_get(std::locale loc, const std::string& input)
{
    std::istringstream str(input);
    str.imbue(loc);
    long double units;
    // Die folgende Zeile kann einfacher mit std::get_money(units) geschrieben werden
    std::ios_base::iostate err = std::ios_base::goodbit;
    std::istreambuf_iterator<char> ret =
        std::use_facet<std::money_get<char>>(loc).get(
            std::istreambuf_iterator<char>(str),
            std::istreambuf_iterator<char>(),
            false, str, err, units);
    str.setstate(err);
    std::istreambuf_iterator<char> last{};
    if (str)
    {
        std::cout << "Erfolgreich geparst '" << str.str() << "' als "
                  << units / 100 << " Einheiten\n";
        if (ret != last)
        {
            std::cout << "Verbleibender Inhalt: '";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
            std::cout << "'\n";
        }
        else
            std::cout << "Die Eingabe wurde vollständig verarbeitet\n";
    }
    else
    {
        std::cout << "Parsen fehlgeschlagen. Nicht geparster String: '";
        std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
        std::cout << "'\n";
    }
}
int main()
{
    demo_money_get(std::locale("en_US.utf8"), "-$5.12 abc");
    demo_money_get(std::locale("ms_MY.utf8"), "(RM5.12) def");
}

Ausgabe:

Erfolgreich geparst '-$5.12 abc' als -5.12 Einheiten
Verbleibender Inhalt: ' abc'
Erfolgreich geparst '(RM5.12) def' als -5.12 Einheiten
Verbleibender Inhalt: ' def'

Siehe auch

definiert monetäre Formatierungsparameter, die von std::money_get und std::money_put verwendet werden
(Klassentemplate)
analysiert und konstruiert einen monetären Wert aus einer Eingabezeichenfolge
(Klassentemplate)
(C++11)
analysiert einen monetären Wert
(Funktionstemplate)