Namespaces
Variants

std:: num_put

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

class CharT,
class OutputIt = std:: ostreambuf_iterator < CharT >

> class num_put ;

La clase std::num_put encapsula las reglas para formatear valores numéricos como cadenas. Específicamente, los tipos bool , long , unsigned long , long long , unsigned long long (desde C++11) , double , long double , void * , y todos los tipos convertibles implícitamente a estos (como int o float ) están soportados. Los operadores estándar de salida con formato (como cout << n ; ) utilizan la faceta std::num_put de la configuración regional del flujo de E/S para generar la representación textual de los números.

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

Diagrama de herencia

Si una especialización de std::num_put no está garantizada que sea proporcionada por la biblioteca estándar (ver abajo), los comportamientos de sus funciones put() y do_put() 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_put < char > crea representaciones de números en cadenas estrechas
std :: num_put < wchar_t > crea representaciones de números en cadenas anchas

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 OutputIt

Miembros de datos

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

Funciones miembro

construye un nuevo facet num_put
(función miembro pública)
invoca do_put
(función miembro pública)

Funciones miembro protegidas

destruye una faceta num_put
(función miembro protegida)
[virtual]
formatea un número y escribe en el flujo de salida
(función miembro virtual protegida)

Ejemplo

#include <iostream>
#include <iterator>
#include <locale>
#include <string>
int main()
{
    double n = 1234567.89;
    std::cout.imbue(std::locale("de_DE.UTF-8"));
    std::cout << "Conversión directa a string:\n"
              << std::to_string(n) << '\n'
              << "Salida usando una configuración regional alemana:\n"
              << std::fixed << n << '\n'
              << "Salida usando una configuración regional americana:\n";
    // usar el facet directamente
    std::cout.imbue(std::locale("en_US.UTF-8"));
    auto& f = std::use_facet<std::num_put<char>>(std::cout.getloc());
    f.put(std::ostreambuf_iterator<char>(std::cout), std::cout, ' ', n);
    std::cout << '\n';
}

Salida posible:

Conversión directa a string:
1234567.890000
Salida usando una configuración regional alemana:
1.234.567,890000
Salida usando una configuración regional americana:
1,234,567.890000

Informes de defectos

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

DR Se aplica a Comportamiento publicado Comportamiento correcto
LWG 427 C++98 num_put 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 de carácter CharT podía
garantizarse ser aceptado por num_put
puede garantizar aceptar tipos de contenedor
de caracteres definidos por la implementación

Véase también

define las reglas de puntuación numérica
(plantilla de clase)
analiza valores numéricos de una secuencia de caracteres de entrada
(plantilla de clase)
(C++11)
convierte un valor entero o de punto flotante a string
(función)
(C++11)
convierte un valor entero o de punto flotante a wstring
(función)