Namespaces
Variants

std:: num_get

From cppreference.net
Défini dans l'en-tête <locale>
template <

class CharT,
class InputIt = std:: istreambuf_iterator < CharT >

> class num_get ;

La classe std::num_get encapsule les règles d'analyse des représentations textuelles des valeurs numériques. Plus précisément, les types bool , unsigned short , unsigned int , long , unsigned long , long long , unsigned long long (depuis C++11) , float , double , long double , et void * sont pris en charge. Les opérateurs d'entrée de formatage standard (tels que cin >> n ; ) utilisent le facet std::num_get des paramètres régionaux du flux d'E/S pour analyser les représentations textuelles des nombres.

cpp/locale/locale/facet std-num get-inheritance.svg

Diagramme d'héritage

Si une spécialisation de std::num_get n'est pas garantie d'être fournie par la bibliothèque standard (voir ci-dessous), les comportements de ses fonctions get() et do_get() ne sont pas garantis comme spécifié.

Table des matières

Spécialisations

La bibliothèque standard garantit la fourniture des spécialisations suivantes (elles sont requises pour être implémentées par tout objet locale ):

Défini dans l'en-tête <locale>
std :: num_get < char > crée l'analyse de chaînes étroites pour les nombres
std :: num_get < wchar_t > crée l'analyse de chaînes larges pour les nombres

En outre, la bibliothèque standard garantit également de fournir chaque spécialisation qui satisfait aux exigences de type suivantes :

Types imbriqués

Type Définition
char_type CharT
iter_type InputIt

Membres de données

Membre Description
std::locale::id id [static] l'identifiant de la facette

Fonctions membres

construit un nouveau facet num_get
(fonction membre publique)
invoque do_get
(fonction membre publique)

Fonctions membres protégées

détruit un facet num_get
(fonction membre protégée)
[virtual]
analyse un nombre depuis un flux d'entrée
(fonction membre virtuelle protégée)

Exemple

#include <iostream>
#include <iterator>
#include <locale>
#include <sstream>
#include <string>
int main()
{
    std::string de_double = "1.234.567,89";
    std::string us_double = "1,234,567.89";
    // analyse en utilisant les flux
    std::istringstream de_in(de_double);
    de_in.imbue(std::locale("de_DE.UTF-8"));
    double f1;
    de_in >> f1;
    std::istringstream us_in(de_double);
    us_in.imbue(std::locale("en_US.UTF-8"));
    double f2;
    us_in >> f2;
    std::cout << "L'analyse de " << de_double << " en tant que double donne " << std::fixed
              << f1 << " dans la locale de_DE et " << f2 << " dans en_US\n";
    // utiliser directement le facet
    std::istringstream s3(us_double);
    s3.imbue(std::locale("en_US.UTF-8"));
    auto& f = std::use_facet<std::num_get<char>>(s3.getloc());
    std::istreambuf_iterator<char> beg(s3), end;
    double f3;
    std::ios::iostate err;
    f.get(beg, end, s3, err, f3);
    std::cout << "l'analyse de " << us_double
              << " en tant que double en utilisant directement le facet en_US donne " << f3 << '\n';
}

Sortie :

L'analyse de 1.234.567,89 en tant que double donne 1234567.890000 dans la locale de_DE et 1.234000 dans en_US
l'analyse de 1,234,567.89 en tant que double en utilisant directement le facet en_US donne 1234567.890000

Rapports de défauts

Les rapports de défauts modifiant le comportement suivants ont été appliqués rétroactivement aux normes C++ précédemment publiées.

DR Applicable à Comportement publié Comportement corrigé
LWG 427 C++98 num_get était garanti d'accepter tout CharT qui
répond aux exigences pour un caractère sur lequel
n'importe quel composant des iostreams peut être instancié
garantit uniquement d'accepter char ,
wchar_t et autres types de caractères
définis par l'implémentation
LWG 2392 C++98 seul le type de caractère CharT pouvait être
garanti d'être accepté par num_get
peut garantir d'accepter les types de conteneurs
de caractères définis par l'implémentation

Voir aussi

définit les règles de ponctuation numérique
(modèle de classe)
formate les valeurs numériques pour la sortie sous forme de séquence de caractères
(modèle de classe)
extrait des données formatées
(fonction membre publique de std::basic_istream<CharT,Traits> )