std::money_get<CharT,InputIt>:: get, do_get
|
Défini dans l'en-tête
<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) | |
Analyse une valeur monétaire à partir d'un itérateur d'entrée et écrit le résultat dans un long double ou une chaîne de caractères.
do_get
de la classe la plus dérivée.
ct
pour le reste de cette page), le facette
std::
moneypunct
<
CharT, intl
>
imbriqué dans
str.
getloc
(
)
(
mp
pour le reste de cette page), et les indicateurs de formatage du flux obtenus depuis
str.
flags
(
)
.
Si l'itérateur d'entrée
beg
devient égal à
end
avant que l'analyse ne soit terminée, définit à la fois
failbit
et
eofbit
dans
err
. Si l'analyse échoue pour une autre raison, définit le
failbit
dans
err
. Dans les deux cas, ne modifie pas le paramètre de sortie (
units
ou
digits
) en cas d'erreur.
Si l'analyse réussit, ne modifie pas err , et stocke le résultat dans units ou digits .
Le formatage pattern utilisé par cette fonction est toujours mp. neg_format ( ) .
Si mp. grouping ( ) n'autorise pas les séparateurs de milliers, le premier séparateur rencontré est traité comme une erreur d'analyse, sinon ils sont traités comme facultatifs.
Si money_base::space ou money_base::none est le dernier élément dans le pattern , l'analyseur n'essaie pas de consommer d'espace blanc après que les autres composantes de la valeur monétaire ont été analysées. Sinon, un ou plusieurs caractères d'espacement sont consommés là où money_base::space apparaît.
Si l'indicateur
showbase
est défini dans
str.
flags
(
)
, le symbole monétaire ou la chaîne de devise est requis ; s'il n'est pas défini, le symbole monétaire est facultatif.
Si le premier caractère de la chaîne retournée par mp. positive_sign ( ) ou mp. negative_sign ( ) est trouvé dans la position money_base::sign du motif de formatage, il est consommé, et les autres caractères de cette chaîne sont attendus et consommés après tous les autres composants de la valeur monétaire. Si à la fois mp. positive_sign ( ) et mp. negative_sign ( ) sont non vides, le signe est requis et doit correspondre au premier caractère de l'une de ces chaînes. Si l'une de ces chaînes est vide, le signe est optionnel (et s'il est absent, le signe du résultat correspond à la chaîne qui était vide). Si les deux chaînes sont vides, ou ont le même premier caractère, le résultat reçoit le signe positif. Si le paramètre de sortie est une chaîne ( digits ) et que le résultat est négatif, la valeur ct. widen ( '-' ) est stockée comme premier caractère du résultat.
Les chiffres de l'entrée sont extraits dans l'ordre dans lequel ils apparaissent et sont placés dans
digits
(après élargissement par
ct.
widen
(
)
si nécessaire), ou dans un tampon temporaire
buf1
, à partir duquel la valeur de
units
est construite comme si par
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);
` et contient des termes spécifiques au C++. Seule la structure HTML a été préservée sans modification du contenu du code.
(où
n
est le nombre de caractères extraits de l'entrée et stockés dans
buf1
et
buf2
est un autre tampon de caractères suffisamment grand).
Table des matières |
Valeur de retour
Un itérateur pointant immédiatement après le dernier caractère reconnu comme partie valide de la chaîne monétaire en entrée.
Notes
Les unités monétaires sont supposées être les plus petites unités non fractionnaires de la devise : cents aux États-Unis, yen au Japon. Ainsi, la séquence d'entrée "$1,056.23" dans une locale américaine produit le nombre 105623.0 en units ou une chaîne "105623" en digits .
Parce que le symbole monétaire est optionnel si
showbase
est désactivé mais que l'intégralité du
negative_sign()
multicaractère est requis, étant donné le motif de formatage
{
sign, value, space, symbol
}
avec
showbase
désactivé et negative_sign de
"-"
, la chaîne
"-1.23 €"
est analysée comme
-
123
et laisse "€" non consommé dans le flux d'entrée, mais si negative_sign est
"()"
, la chaîne
"(1.23 €)"
est entièrement consommée.
Le manipulateur d'E/S std::get_money offre une interface plus simple à cette fonction.
Exemple
#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"); }
Sortie :
Successfully parsed '-$5.12 abc' as -5.12 units Remaining content: ' abc' Successfully parsed '(RM5.12) def' as -5.12 units Remaining content: ' def'
Voir aussi
|
définit les paramètres de formatage monétaire utilisés par
std::money_get
et
std::money_put
(modèle de classe) |
|
|
analyse et construit une valeur monétaire à partir d'une séquence de caractères d'entrée
(modèle de classe) |
|
|
(C++11)
|
analyse une valeur monétaire
(modèle de fonction) |