from_chars( const char* first, const char* last,
from_chars( const char* first, const char* last,
/* floating-point-type */& value,
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 of value, value is unmodified, otherwise the characters matching the pattern are interpreted as a text representation of an arithmetic value, which is stored in value.
Integer parsers: Expects the pattern identical to the one used by
std::strtolin the default ("C") locale and the given non-zero numeric base, except that
The library provides overloads for all
cv-unqualified(since C++23)signed and unsigned integer types and
charas the referenced type of the parameter
value.
In any case, the resulting value is one of at most two floating-point values closest to the value of the string matching the pattern, after rounding according to
std::round_to_nearest.
The library provides overloads for all cv-unqualified standard(until C++23) floating-point types as the referenced type of the parameter value.
[edit] Parameters 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 type std::chars_format [edit] Return valueOn success, returns a value of type std::from_chars_result such that ptr
points at the first character not matching the pattern, or has the value equal to last if all characters match and ec
is value-initialized.
If there is no pattern match, returns a value of type std::from_chars_result such that ptr
equals first and ec
equals std::errc::invalid_argument. value is unmodified.
If the pattern was matched, but the parsed value is not in the range representable by the type of value, returns value of type std::from_chars_result such that ec
equals std::errc::result_out_of_range and ptr
points at the first character not matching the pattern. value is unmodified.
Throws nothing.
[edit] NotesUnlike 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 as std::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 or XML).
The guarantee that std::from_chars
can recover every floating-point value formatted by std::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.
[edit] Example#include <cassert> #include <charconv> #include <iomanip> #include <iostream> #include <optional> #include <string_view> #include <system_error> int main() { for (std::string_view const 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'; else if (ec == std::errc::invalid_argument) std::cout << "This is not a number.\n"; else if (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 >= 202306L if (std::from_chars(s.data(), s.data() + s.size(), value)) #else if (std::from_chars(s.data(), s.data() + s.size(), value).ec == std::errc{}) #endif return value; else return std::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.[edit] Defect reports
The following behavior-changing defect reports were applied retroactively to previously published C++ standards.
[edit] See alsoRetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4