Namespaces
Variants

std:: num_get

From cppreference.net
Definido en el encabezado <locale>
template <

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

> class num_get ;

La clase std::num_get encapsula las reglas para analizar representaciones de cadenas de valores numéricos. Específicamente, los tipos bool , unsigned short , unsigned int , long , unsigned long , long long , unsigned long long (desde C++11) , float , double , long double , y void * están soportados. Los operadores de entrada de formato estándar (como cin >> n ; ) utilizan la faceta std::num_get de la configuración regional del flujo de E/S para analizar las representaciones textuales de los números.

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

Diagrama de herencia

Si una especialización de std::num_get no está garantizada que sea proporcionada por la biblioteca estándar (ver abajo), los comportamientos de sus funciones get() y do_get() no están garantizados como se especifica.

Contenidos

Especializaciones

La biblioteca estándar garantiza proporcionar las siguientes especializaciones (están requeridas para ser implementadas por cualquier objeto locale ):

Definido en el encabezado <locale>
std :: num_get < char > crea análisis de cadenas estrechas de números
std :: num_get < wchar_t > crea análisis de cadenas anchas de números

Además, la biblioteca estándar también garantiza proporcionar cada especialización que cumpla con los siguientes requisitos de tipo:

Tipos anidados

Tipo Definición
char_type CharT
iter_type InputIt

Miembros de datos

Miembro Descripción
std::locale::id id [static] el identificador del facet

Funciones miembro

construye un nuevo facet num_get
(función miembro pública)
invoca do_get
(función miembro pública)

Funciones miembro protegidas

destruye una faceta num_get
(función miembro protegida)
[virtual]
analiza un número desde un flujo de entrada
(función miembro virtual protegida)

Ejemplo

#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";
    // analizar usando streams
    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 << "Parsing " << de_double << " as double gives " << std::fixed
              << f1 << " in de_DE locale and " << f2 << " in en_US\n";
    // usar el facet directamente
    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 << "parsing " << us_double
              << " as double using raw en_US facet gives " << f3 << '\n';
}

Salida:

Parsing 1.234.567,89 as double gives 1234567.890000 in de_DE locale and 1.234000 in en_US
parsing 1,234,567.89 as double using raw en_US facet gives 1234567.890000

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C++ publicados anteriormente.

DR Aplicado a Comportamiento publicado Comportamiento correcto
LWG 427 C++98 num_get garantizaba aceptar cualquier CharT que
cumpliese los requisitos para un carácter sobre el cual
cualquier componente de iostream pudiera instanciarse
solo garantiza aceptar char ,
wchar_t y otros tipos de carácter
definidos por la implementación
LWG 2392 C++98 solo el tipo carácter CharT podía
garantizarse ser aceptado por num_get
puede garantizar aceptar tipos contenedores
de carácter definidos por la implementación

Véase también

define las reglas de puntuación numérica
(plantilla de clase)
formatea valores numéricos para salida como secuencia de caracteres
(plantilla de clase)
extrae datos formateados
(función miembro pública de std::basic_istream<CharT,Traits> )