std::money_get<CharT,InputIt>:: get, do_get
|
Definiert im Header
<locale>
|
||
|
public
:
iter_type get
(
iter_type beg, iter_type end,
bool
intl,
std::
ios_base
&
str,
|
(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,
|
(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.
do_get
der am stärksten abgeleiteten Klasse auf.
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) |