[charconv.from.chars]

# 28 Text processing library [[text]](./#text)

## 28.2 Primitive numeric conversions [[charconv]](charconv#from.chars)

### 28.2.3 Primitive numeric input conversion [charconv.from.chars]

[1](#1)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L240)

All functions named from_chars analyze the string [first, last)
for a pattern,
where [first, last) is required to be a valid range[.](#1.sentence-1)

If no characters match the pattern,value is unmodified,
the member ptr of the return value is first and
the member ec is equal to errc​::​invalid_argument[.](#1.sentence-2)

[*Note [1](#note-1)*:

If the pattern allows for an optional sign,
but the string has no digit characters following the sign,
no characters match the pattern[.](#1.sentence-3)

â *end note*]

Otherwise,
the characters matching the pattern
are interpreted as a representation
of a value of the type of value[.](#1.sentence-4)

The member ptr of the return value
points to the first character
not matching the pattern,
or has the value last if all characters match[.](#1.sentence-5)

If the parsed value
is not in the range
representable by the type of value,value is unmodified and
the member ec of the return value
is equal to errc​::​result_out_of_range[.](#1.sentence-6)

Otherwise,value is set to the parsed value,
after rounding according to round_to_nearest ([[round.style]](round.style "17.3.4 Enum float_­round_­style")), and
the member ec is value-initialized[.](#1.sentence-7)

[ð](#lib:from_chars)

`constexpr from_chars_result from_chars(const char* first, const char* last,
                                       integer-type& value, int base = 10);
`

[2](#2)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L282)

*Preconditions*: base has a value between 2 and 36 (inclusive)[.](#2.sentence-1)

[3](#3)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L286)

*Effects*: The pattern is the expected form of the subject sequence
in the "C" locale
for the given nonzero base,
as described for strtol,
except that no "0x" or "0X" prefix shall appear
if the value of base is 16,
and except that '-' is the only sign that may appear,
and only if value has a signed type[.](#3.sentence-1)

[4](#4)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L298)

*Throws*: Nothing[.](#4.sentence-1)

[ð](#lib:from_chars_)

`from_chars_result from_chars(const char* first, const char* last, floating-point-type& value,
                             chars_format fmt = chars_format::general);
`

[5](#5)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L310)

*Preconditions*: fmt has the value of
one of the enumerators of chars_format[.](#5.sentence-1)

[6](#6)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L315)

*Effects*: The pattern is the expected form of the subject sequence
in the "C" locale,
as described for strtod,
except that

- [(6.1)](#6.1)

the sign '+' may only appear in the exponent part;

- [(6.2)](#6.2)

if fmt has chars_format​::​scientific set
but not chars_format​::​fixed,
the otherwise optional exponent part shall appear;

- [(6.3)](#6.3)

if fmt has chars_format​::​fixed set
but not chars_format​::​scientific,
the optional exponent part shall not appear; and

- [(6.4)](#6.4)

if fmt is chars_format​::​hex,
the prefix "0x" or "0X" is assumed[.](#6.sentence-1)
  [*Example [1](#example-1)*:
  The string 0x123 is parsed to have the value0 with remaining characters x123[.](#6.4.sentence-2)
 â *end example*]

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[.](#6.sentence-2)

[7](#7)

[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L346)

*Throws*: Nothing[.](#7.sentence-1)

See also: ISO/IEC 9899:2024, 7.22.1.3, 7.22.1.4
