Namespaces
Variants

std:: num_put

From cppreference.net
Определено в заголовочном файле <locale>
template <

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

> class num_put ;

Класс std::num_put инкапсулирует правила форматирования числовых значений в строки. В частности, поддерживаются типы bool , long , unsigned long , long long , unsigned long long (начиная с C++11) , double , long double , void * , а также все типы, неявно преобразуемые в них (такие как int или float ). Стандартные операторы вывода форматирования (такие как cout << n ; ) используют фасет std::num_put локали потока ввода-вывода для генерации текстового представления чисел.

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

Диаграмма наследования

Если специализация std::num_put не гарантированно предоставляется стандартной библиотекой (см. ниже), поведение её функций put() и do_put() не гарантируется как указанное.

Содержание

Специализации

Стандартная библиотека гарантированно предоставляет следующие специализации (они должны быть реализованы любым объектом локали ):

Определено в заголовочном файле <locale>
std :: num_put < char > создает узкосимвольные строковые представления чисел
std :: num_put < wchar_t > создает широкосимвольные строковые представления чисел

Кроме того, стандартная библиотека также гарантированно предоставляет каждую специализацию, удовлетворяющую следующим требованиям к типам:

Вложенные типы

Тип Определение
char_type CharT
iter_type OutputIt

Члены данных

Участник Описание
std::locale::id id [static] идентификатор аспекта

Функции-члены

создает новый num_put фасет
(публичная функция-член)
вызывает do_put
(публичная функция-член)

Защищенные функции-члены

уничтожает объект num_put фасета
(защищённая функция-член)
[virtual]
форматирует число и записывает в выходной поток
(виртуальная защищённая функция-член)

Пример

#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 << "Прямое преобразование в строку:\n"
              << std::to_string(n) << '\n'
              << "Вывод с использованием немецкой локали:\n"
              << std::fixed << n << '\n'
              << "Вывод с использованием американской локали:\n";
    // используем фасет напрямую
    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';
}

Возможный вывод:

Прямое преобразование в строку:
1234567.890000
Вывод с использованием немецкой локали:
1.234.567,890000
Вывод с использованием американской локали:
1,234,567.890000

Отчеты о дефектах

Следующие отчеты об изменениях поведения, влияющие на дефекты, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Applied to Behavior as published Correct behavior
LWG 427 C++98 num_put был гарантированно принимал любой CharT , который
соответствует требованиям для символа, на котором
может быть инстанцирован любой из компонентов iostream
гарантирует принятие только char ,
wchar_t и других определяемых
реализацией символьных типов
LWG 2392 C++98 только символьный тип CharT мог быть
гарантированно принят num_put
может гарантировать принятие определяемых
реализацией типов символьных контейнеров

Смотрите также

определяет правила числовой пунктуации
(шаблон класса)
анализирует числовые значения из входной последовательности символов
(шаблон класса)
(C++11)
преобразует целочисленное или вещественное значение в string
(функция)
(C++11)
преобразует целочисленное или вещественное значение в wstring
(функция)