Localization library | |||||||||||||||||||||||||
Regular expressions library(C++11) | |||||||||||||||||||||||||
Formatting library(C++20) | |||||||||||||||||||||||||
Null-terminated sequence utilities | |||||||||||||||||||||||||
Byte strings | |||||||||||||||||||||||||
Multibyte strings | |||||||||||||||||||||||||
Wide strings | |||||||||||||||||||||||||
Primitive numeric conversions | |||||||||||||||||||||||||
| |||||||||||||||||||||||||
Text encoding identifications | |||||||||||||||||||||||||
|
Defined in header <charconv> | ||
std::from_chars_result from_chars(constchar* first,constchar* last, | (1) | (since C++17) (constexpr since C++23) |
std::from_chars_result from_chars(constchar* first,constchar* last, | (2) | (since C++17) |
Analyzes the character sequence[
first,
last)
for a pattern described below. If no characters match the pattern or if the value obtained by parsing the matched characters is not representable in the type ofvalue,value is unmodified, otherwise the characters matching the pattern are interpreted as a text representation of an arithmetic value, which is stored invalue.
fmt
hasstd::chars_format::scientific set but notstd::chars_format::fixed, the exponent part is required (otherwise it is optional)fmt
hasstd::chars_format::fixed set but notstd::chars_format::scientific, the optional exponent is not permittedfmt
isstd::chars_format::hex, the prefix"0x" or"0X" is not permitted (the string"0x123" parses as the value"0" with unparsed remainder"x123")Contents |
first, last | - | valid character range to parse |
value | - | the out-parameter where the parsed value is stored if successful |
base | - | integer base to use: a value between 2 and 36 (inclusive). |
fmt | - | floating-point formatting to use, a bitmask of typestd::chars_format |
On success, returns a value of typestd::from_chars_result such thatptr
points at the first character not matching the pattern, or has the value equal tolast if all characters match andec
is value-initialized.
If there is no pattern match, returns a value of typestd::from_chars_result such thatptr
equalsfirst andec
equalsstd::errc::invalid_argument.value is unmodified.
If the pattern was matched, but the parsed value is not in the range representable by the type ofvalue, returns value of typestd::from_chars_result such thatec
equalsstd::errc::result_out_of_range andptr
points at the first character not matching the pattern.value is unmodified.
Throws nothing.
Unlike other parsing functions in C++ and C libraries,std::from_chars
is locale-independent, non-allocating, and non-throwing. Only a small subset of parsing policies used by other libraries (such asstd::sscanf) is provided. This is intended to allow the fastest possible implementation that is useful in common high-throughput contexts such as text-based interchange (JSON orXML).
The guarantee thatstd::from_chars
can recover every floating-point value formatted bystd::to_chars exactly is only provided if both functions are from the same implementation.
A pattern consisting of a sign with no digits following it is treated as pattern that did not match anything.
Feature-test macro | Value | Std | Feature |
---|---|---|---|
__cpp_lib_to_chars | 201611L | (C++17) | Elementary string conversions (std::from_chars ,std::to_chars) |
202306L | (C++26) | Testing for success or failure of<charconv> functions | |
__cpp_lib_constexpr_charconv | 202207L | (C++23) | Addconstexpr modifiers tostd::from_chars andstd::to_chars overloads for integral types |
#include <cassert>#include <charconv>#include <iomanip>#include <iostream>#include <optional>#include <string_view>#include <system_error> int main(){for(std::string_viewconst str:{"1234","15 foo","bar"," 42","5000000000"}){std::cout<<"String: "<<std::quoted(str)<<". ";int result{};auto[ptr, ec]= std::from_chars(str.data(), str.data()+ str.size(), result); if(ec==std::errc())std::cout<<"Result: "<< result<<", ptr -> "<<std::quoted(ptr)<<'\n';elseif(ec==std::errc::invalid_argument)std::cout<<"This is not a number.\n";elseif(ec==std::errc::result_out_of_range)std::cout<<"This number is larger than an int.\n";} // C++23's constexpr from_char demo / C++26's operator bool() demo:auto to_int=[](std::string_view s)->std::optional<int>{int value{};#if __cpp_lib_to_chars >= 202306Lif(std::from_chars(s.data(), s.data()+ s.size(), value))#elseif(std::from_chars(s.data(), s.data()+ s.size(), value).ec==std::errc{})#endifreturn value;elsereturnstd::nullopt;}; assert(to_int("42")==42);assert(to_int("foo")==std::nullopt);#if __cpp_lib_constexpr_charconv and __cpp_lib_optional >= 202106 static_assert(to_int("42")==42); static_assert(to_int("foo")==std::nullopt);#endif}
Output:
String: "1234". Result: 1234, ptr -> ""String: "15 foo". Result: 15, ptr -> " foo"String: "bar". This is not a number.String: " 42". This is not a number.String: "5000000000". This number is larger than an int.
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
DR | Applied to | Behavior as published | Correct behavior |
---|---|---|---|
LWG 2955 | C++17 | this function was in<utility> and usedstd::error_code | moved to<charconv> and usesstd::errc |
LWG 3373 | C++17 | std::from_chars_result might have additional members | additional members are prohibited |
(C++17) | the return type ofstd::from_chars (class)[edit] |
(C++17) | converts an integer or floating-point value to a character sequence (function)[edit] |
(C++11)(C++11)(C++11) | converts a string to a signed integer (function)[edit] |
(C++11)(C++11)(C++11) | converts a string to a floating point value (function)[edit] |
(C++11) | converts a byte string to an integer value (function)[edit] |
converts a byte string to a floating-point value (function)[edit] | |
reads formatted input fromstdin, a file stream or a buffer (function)[edit] | |
extracts formatted data (public member function of std::basic_istream<CharT,Traits> )[edit] |