Namensräume
Varianten
Aktionen

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

Von cppreference.com
< cpp‎ | locale‎ | money get
 
 
 
 
std::money_get
Memberfunktionen
money_get::getmoney_get::do_get
 
Definiert in 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 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 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 eine Zeichenkette.

1,2) Öffentliche Memberfunktionen, rufen die Memberfunktion do_get der am stärksten abgeleiteten Klasse auf.
3,4) Liest Zeichen vom Eingabeiterator beg und erwartet, einen monetären Wert zu finden, der gemäß den Regeln formatiert ist, die durch die Facette std::ctype, die in str.getloc() eingebettet ist (im Folgenden ct genannt), die Facette std::moneypunct<CharT, intl>, die in str.getloc() eingebettet ist (im Folgenden mp genannt), und die aus str.flags() erhaltenen Stream-Formatierungsflags angegeben sind.

Wenn der Eingabeiterator beg gleich end wird, bevor die Analyse abgeschlossen ist, werden sowohl failbit als auch eofbit in err gesetzt. Wenn die Analyse aus einem anderen Grund fehlschlägt, wird das failbit in err gesetzt. In jedem Fall werden die Ausgabeparameter (units oder digits) bei einem Fehler nicht modifiziert.

Wenn die Analyse erfolgreich ist, wird err nicht geändert und das Ergebnis wird in units oder digits gespeichert.

Das von dieser Funktion verwendete Formatierungsmuster (pattern) ist immer mp.neg_format().

Wenn mp.grouping() keine Tausendertrennzeichen zulässt, wird das erste gefundene Trennzeichen als Analysefehler behandelt, andernfalls werden sie als optional behandelt.

Wenn money_base::space oder money_base::none das letzte Element im Formatierungsmuster (pattern) ist, versucht der Parser nicht, nach den anderen Komponenten des monetären Werts Leerzeichen zu verbrauchen. Andernfalls werden ein oder mehrere Leerzeichen verbraucht, wo money_base::space erscheint.

Wenn das Flag showbase 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 an der Position money_base::sign im Formatierungsmuster gefunden wird, wird es verbraucht und der Rest der Zeichen in dieser Zeichenkette wird nach allen anderen Komponenten des monetären Werts erwartet und verbraucht. 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 leeren Zeichenkette). Wenn beide Zeichenketten leer sind oder das gleiche erste Zeichen haben, erhält das Ergebnis das positive Vorzeichen. Wenn der Ausgabeparameter eine Zeichenkette (digits) ist und das Ergebnis negativ ist, wird der Wert ct.widen('-') als erstes Zeichen des Ergebnisses gespeichert.

Ziffern aus der Eingabe werden in der Reihenfolge extrahiert, in der sie erscheinen, und entweder in digits (nach Bedarf durch ct.widen() erweitert) oder in einen temporären Puffer buf1 platziert, aus dem der Wert von units wie folgt konstruiert wird:

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).

Inhalt

[bearbeiten] Rückgabewert

Ein Iterator, der unmittelbar nach dem letzten Zeichen zeigt, das als gültiger Teil der eingegebenen monetären Zeichenkette erkannt wurde.

[bearbeiten] Anmerkungen

Die Währungseinheiten werden als die kleinsten nicht-bruchteiligen Einheiten der Währung angenommen: Cent in den USA, Yen in Japan. So erzeugt die Eingabesequenz "$1,056.23" in einer US-Locale die Zahl 105623.0 in units oder die Zeichenkette "105623" in digits.

Da das Währungssymbol optional ist, wenn showbase aus ist, aber die gesamte Multizeichenkette negative_sign() erforderlich ist, wird bei dem Formatierungsmuster {sign, value, space, symbol} mit showbase aus und negative_sign von "-" die Zeichenkette "-1.23 €" als -123 geparst und "€" unberührt im Eingabestrom belassen. Wenn jedoch negative_sign "()" ist, wird die Zeichenkette "(1.23 €)" vollständig verbraucht.

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

[bearbeiten] 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;
 
    // The following can be written simpler with std::get_money(units)
    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 << "Successfully parsed '" << str.str() << "' as "
                  << units / 100 << " units\n";
        if (ret != last)
        {
            std::cout << "Remaining content: '";
            std::copy(ret, last, std::ostreambuf_iterator<char>(std::cout));
            std::cout << "'\n";
        }
        else
            std::cout << "The input was fully consumed\n";
    }
    else
    {
        std::cout << "Parse failed. Unparsed 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

Successfully parsed '-$5.12 abc' as -5.12 units
Remaining content: ' abc'
Successfully parsed '(RM5.12) def' as -5.12 units
Remaining content: ' def'

[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)
Parst einen Geldbetrag
(Funktion-Template) [bearbeiten]