std:: num_put
|
Определено в заголовочном файле
<locale>
|
||
|
template
<
class
CharT,
|
||
Класс
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
локали потока ввода-вывода для генерации текстового представления чисел.
Диаграмма наследования
Если специализация
std::num_put
не гарантированно предоставляется стандартной библиотекой (см. ниже), поведение её функций
put()
и
do_put()
не гарантируется как указанное.
Содержание |
Специализации
Стандартная библиотека гарантированно предоставляет следующие специализации (они должны быть реализованы любым объектом локали ):
|
Определено в заголовочном файле
<locale>
|
|
| std :: num_put < char > | создает узкосимвольные строковые представления чисел |
| std :: num_put < wchar_t > | создает широкосимвольные строковые представления чисел |
Кроме того, стандартная библиотека также гарантированно предоставляет каждую специализацию, удовлетворяющую следующим требованиям к типам:
-
CharTявляется одним из- char ,
- wchar_t , и
- любым другим определённым реализацией типом контейнера символов , который удовлетворяет требованиям для символа, на котором могут быть инстанцированы любые из компонентов iostream ; и
-
OutputItдолжен удовлетворять требованиям LegacyOutputIterator .
Вложенные типы
| Тип | Определение |
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
(функция) |