Spec-Zone.ru › C++

std::to_chars

Определён в заголовочном файле <charconv>
std::to_chars_result
    to_chars( char* first, char* last,
              /* integer-type */ value, int base = 10 );
(1) (начиная с C++17)
(constexpr начиная с C++23)
std::to_chars_result
    to_chars( char*, char*, bool, int = 10 ) = delete;
(2) (начиная с C++17)
std::to_chars_result
    to_chars( char* first, char* last, /* floating-point-type */ value );
(3) (начиная с C++17)
std::to_chars_result
    to_chars( char* first, char* last, /* floating-point-type */ value,
              std::chars_format fmt );
(4) (начиная с C++17)
std::to_chars_result
    to_chars( char* first, char* last, /* floating-point-type */ value,
              std::chars_format fmt, int precision );
(5) (начиная с C++17)

Преобразует value в символьную строку, последовательно заполняя диапазон [first, last), где [first, last) должен быть допустимым диапазоном.

1) Форматирование целых чисел: value преобразуется в строку цифр в указанной base (без лишних ведущих нулей). Цифры в диапазоне 10..35 (включительно) представляются строчными символами a..z. Если значение меньше нуля, представление начинается со знака минус. Библиотека предоставляет перегрузки для всех целочисленных типов со знаком и без знакабез cv-квалификаторов(начиная с C++23), а также для типа char в качестве типа параметра value.
2) Перегрузка для bool удалена. std::to_chars отклоняет аргумент типа bool, поскольку в результате получилось бы "0"/"1", но не "false"/"true", если бы это было разрешено.
3) value преобразуется в строку, как если бы использовался std::printf в локали по умолчанию ("C"). Спецификатор преобразования — f или e (при равенстве предпочтение отдаётся f); выбор определяется требованием к кратчайшему представлению: строковое представление состоит из наименьшего количества символов, при котором перед десятичной точкой (если она есть) находится хотя бы одна цифра, а разбор представления с помощью соответствующей функции std::from_chars точно восстанавливает значение. Если таких представлений несколько, выбирается то, которое имеет наименьшее отличие от value; оставшиеся равенства разрешаются округлением согласно std::round_to_nearest. Библиотека предоставляет перегрузки для всех типов с плавающей точкой без cv-квалификаторов стандартных(до C++23) в качестве типа параметра value.
4) Аналогично (3), но преобразование, заданное для printf-подобной функции, — f, если fmt — std::chars_format::fixed, e, если fmt — std::chars_format::scientific, a (но без начального "0x" в результате), если fmt — std::chars_format::hex, и g, если fmt — chars_format::general. Библиотека предоставляет перегрузки для всех типов с плавающей точкой без cv-квалификаторов стандартных(до C++23) в качестве типа параметра value.
5) Аналогично (4), за исключением того, что точность задаётся параметром precision, а не требованием к кратчайшему представлению. Библиотека предоставляет перегрузки для всех типов с плавающей точкой без cv-квалификаторов стандартных(до C++23) в качестве типа параметра value.

Параметры

first, last - символьный диапазон для записи
value - значение, которое требуется преобразовать в строковое представление
base - основание системы счисления: значение от 2 до 36 (включительно).
fmt - форматирование числа с плавающей точкой; битовая маска типа std::chars_format
precision - точность форматирования числа с плавающей точкой

Возвращаемое значение

В случае успеха возвращает значение типа std::to_chars_result, такое что ec равно инициализированному по значению std::errc, а ptr — указателю на элемент сразу после последнего записанного символа. Обратите внимание, что строка не завершается нулевым символом.

В случае ошибки возвращает значение типа std::to_chars_result, содержащее std::errc::value_too_large в ec, копию значения last в ptr, а содержимое диапазона [first, last) остаётся в неуказанном состоянии.

Исключения

Ничего не выбрасывает.

Примечания

В отличие от других функций форматирования в библиотеках C++ и C, std::to_chars не зависит от локали, не выделяет память и не выбрасывает исключений. Предоставляется лишь небольшое подмножество политик форматирования, используемых другими библиотеками (например, std::sprintf). Это позволяет реализовать максимально быструю функцию, полезную в распространённых сценариях с высокой пропускной способностью, таких как текстовый обмен данными (JSON или XML).

Гарантия того, что std::from_chars сможет точно восстановить любое значение с плавающей точкой, отформатированное с помощью std::to_chars, действует только в том случае, если обе функции взяты из одной и той же реализации.

Чтобы отформатировать значение bool как "0"/"1", его необходимо явно привести к другому целочисленному типу.

Макрос проверки поддержки возможностей Значение Стандарт Возможность
__cpp_lib_to_chars 201611L (C++17) Базовые преобразования строк (std::to_chars, std::from_chars)
202306L (C++26) Проверка успешного выполнения или ошибки функций <charconv>
__cpp_lib_constexpr_charconv 202207L (C++23) Добавление модификаторов constexpr к перегрузкам std::to_chars и std::from_chars (1) для целочисленных типов

Пример

#include <charconv>
#include <iomanip>
#include <iostream>
#include <string_view>
#include <system_error>

void show_to_chars(auto... format_args)
{
    const size_t buf_size = 10;
    char buf[buf_size]{};
    std::to_chars_result result = std::to_chars(buf, buf + buf_size, format_args...);

    if (result.ec != std::errc())
        std::cout << std::make_error_code(result.ec).message() << '\n';
    else
    {
        std::string_view str(buf, result.ptr - buf);
        std::cout << std::quoted(str) << '\n';
    }
}

int main()
{
    show_to_chars(42);
    show_to_chars(+3.14159F);
    show_to_chars(-3.14159, std::chars_format::fixed);
    show_to_chars(-3.14159, std::chars_format::scientific, 3);
    show_to_chars(3.1415926535, std::chars_format::fixed, 10);
}

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

"42"
"3.14159"
"-3.14159"
"-3.142e+00"
Value too large for defined data type

Отчёты об ошибках

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

DR Применён к Опубликованное поведение Исправленное поведение
LWG 2955 C++17 эта функция находилась в <utility> и использовала std::error_code перемещена в <charconv> и использует std::errc
LWG 3266 C++17 Аргумент bool принимался и повышался до типа int отклоняется удалённой перегрузкой
LWG 3373 C++17 std::to_chars_result мог иметь дополнительные члены дополнительные члены запрещены

См. также

to_chars_result
(C++17)
тип возвращаемого значения std::to_chars
(класс)
from_chars
(C++17)
преобразует последовательность символов в целое число или число с плавающей точкой
(функция)
to_string
(C++11)
преобразует целое число или число с плавающей точкой в string
(функция)
printffprintfsprintfsnprintf
(C++11)
выводит форматированные данные в stdout, файловый поток или буфер
(функция)
operator<<
вставляет форматированные данные
(открытая функция-член std::basic_ostream<CharT,Traits>)

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/cpp/utility/to_chars

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API