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
Défini dans l'en-tête <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)

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.

1,2) Fonctions membres publiques, appellent la fonction membre do_get de la classe la plus dérivée.
3,4) Lit les caractères depuis l'itérateur d'entrée beg , en s'attendant à trouver une valeur monétaire formatée selon les règles spécifiées par le facette std:: ctype imbriqué dans str. getloc ( ) ( 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);
**Note:** Le code C++ n'a pas été traduit conformément aux instructions, car il se trouve dans des balises `
` 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)