Files
2025-10-25 03:02:53 +03:00

133 lines
4.8 KiB
Markdown
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[format.string.general]
# 28 Text processing library [[text]](./#text)
## 28.5 Formatting [[format]](format#string.general)
### 28.5.2 Format string [[format.string]](format.string#general)
#### 28.5.2.1 General [format.string.general]
[1](#1)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5914)
A [*format string*](#def:format_string "28.5.2.1General[format.string.general]") for arguments args is
a (possibly empty) sequence of[*replacement fields*](#def:replacement_field,format_string "28.5.2.1General[format.string.general]"),[*escape sequences*](#def:escape_sequence,format_string "28.5.2.1General[format.string.general]"),
and characters other than { and }[.](#1.sentence-1)
Let charT be the character type of the format string[.](#1.sentence-2)
Each character that is not part of
a replacement field or an escape sequence
is copied unchanged to the output[.](#1.sentence-3)
An escape sequence is one of {{ or }}[.](#1.sentence-4)
It is replaced with { or }, respectively, in the output[.](#1.sentence-5)
The syntax of replacement fields is as follows:
replacement-field :
{ arg-idopt format-specifieropt }
arg-id :
0
positive-integer
positive-integer :
[*nonzero-digit*](lex.icon#nt:nonzero-digit "5.13.2Integer literals[lex.icon]")
positive-integer [*digit*](lex.name#nt:digit "5.11Identifiers[lex.name]")
nonnegative-integer :
[*digit*](lex.name#nt:digit "5.11Identifiers[lex.name]")
nonnegative-integer [*digit*](lex.name#nt:digit "5.11Identifiers[lex.name]")
[*nonzero-digit*](lex.icon#nt:nonzero-digit "5.13.2Integer literals[lex.icon]") : one of
1 2 3 4 5 6 7 8 9
[*digit*](lex.name#nt:digit "5.11Identifiers[lex.name]") : one of
0 1 2 3 4 5 6 7 8 9
format-specifier :
: format-spec
format-spec :
as specified by the formatter specialization for the argument type; cannot start with }
[2](#2)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5972)
The *arg-id* field specifies the index of
the argument in args whose value is to be formatted and inserted into the output
instead of the replacement field[.](#2.sentence-1)
If there is no argument with
the index *arg-id* in args,
the string is not a format string for args[.](#2.sentence-2)
The optional *format-specifier* field
explicitly specifies a format for the replacement value[.](#2.sentence-3)
[3](#3)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5983)
[*Example [1](#example-1)*: string s = format("{0}-{{", 8); // value of s is "8-{" — *end example*]
[4](#4)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L5990)
If all *arg-id**s* in a format string are omitted
(including those in the *format-spec*,
as interpreted by the corresponding formatter specialization),
argument indices 0, 1, 2, … will automatically be used in that order[.](#4.sentence-1)
If some *arg-id**s* are omitted and some are present,
the string is not a format string[.](#4.sentence-2)
[*Note [1](#note-1)*:
A format string cannot contain a
mixture of automatic and manual indexing[.](#4.sentence-3)
— *end note*]
[*Example [2](#example-2)*: string s0 = format("{} to {}", "a", "b"); // OK, automatic indexing string s1 = format("{1} to {0}", "a", "b"); // OK, manual indexing string s2 = format("{0} to {}", "a", "b"); // not a format string (mixing automatic and manual indexing),// ill-formed string s3 = format("{} to {1}", "a", "b"); // not a format string (mixing automatic and manual indexing),// ill-formed — *end example*]
[5](#5)
[#](http://github.com/Eelis/draft/tree/9adde4bc1c62ec234483e63ea3b70a59724c745a/source/text.tex#L6012)
The *format-spec* field contains[*format specifications*](#def:format_specification,format_string "28.5.2.1General[format.string.general]") that define how the value should be presented[.](#5.sentence-1)
Each type can define its own
interpretation of the *format-spec* field[.](#5.sentence-2)
If *format-spec* does not conform
to the format specifications for
the argument type referred to by *arg-id*,
the string is not a format string for args[.](#5.sentence-3)
[*Example [3](#example-3)*:
- [(5.1)](#5.1)
For arithmetic, pointer, and string types
the *format-spec* is interpreted as a *std-format-spec* as described in [[format.string.std]](format.string.std "28.5.2.2Standard format specifiers")[.](#5.1.sentence-1)
- [(5.2)](#5.2)
For chrono types
the *format-spec* is interpreted as a *chrono-format-spec* as described in [[time.format]](time.format "30.12Formatting")[.](#5.2.sentence-1)
- [(5.3)](#5.3)
For user-defined formatter specializations,
the behavior of the parse member function
determines how the *format-spec* is interpreted[.](#5.3.sentence-1)
— *end example*]