String formatting library (C++11)
Uses a format-specification syntax similar to Python's str.format
or C's printf. By default, it
can format strings, numbers (integral and floating point types) and all types
which have a std::ostream insertion operator. The double-conversion
library is used for fast binary-to-decimal conversions.
XXX: Rewrite
XXX: Rewrite
XXX: Rewrite
'{' [arg-index] ['*' [format-spec-index]] [':' [format-spec]] ['!' [style]] '}'
-
arg-indexPositional arguments. Like Rust's std::fmt:
Each formatting argument is allowed to specify which value argument it's referencing, and if omitted it is assumed to be "the next argument". For example, the format string
"{} {} {}"would take three parameters, and they would be formatted in the same order as they're given. The format string"{2} {1} {0}", however, would format arguments in reverse order.Things can get a little tricky once you start intermingling the two types of positional specifiers. The "next argument" specifier can be thought of as an iterator over the argument. Each time a "next argument" specifier is seen, the iterator advances. This leads to behavior like this:
format(stdout, "{1} {} {0} {}", 1, 2); // => "2 1 1 2"
The internal iterator over the argument has not been advanced by the time the first
{}is seen, so it prints the first argument. Then upon reaching the second{}, the iterator has advanced forward to the second argument.Essentially, parameters which explicitly name their argument do not affect parameters which do not name an argument in terms of positional specifiers.
-
format-spec-indexFor dynamic formatting specifications. The formatting argument must be of type
FormatSpecand will be used for formatting.If ommitted defaults to "next argument".
Note: The
format-specfield (below) overrides the values given in the formatting argument. -
format-specFormat specification. See below.
-
styleAn arbitrary sequence of characters (except '
}'). Can be used for formatting user-defined types.Sequences containing '
}' may be escaped using any of the following delimiters: ''', '"', '{' and '}', '(' and ')', or '[' and ']'. E.g.format(stdout, "{!one}", 1); // => style = "one" format(stdout, "{!'{one}'}", 1); // => style = "{one}" format(stdout, "{!('one')", 1); // => style = "'one'"
[[fill] align] [flags] [width] ['.' [precision]] [conv]
-
[fill] alignIf a valid
alignvalue is specified, it can be preceded by afillcharacter that can be any character and defaults to a space if omitted.The valid
alignvalues are:>: Align right (default).<: Align left.^: Center.=: For numbers, padding is placed after the sign (if any) but before the digits. Ignored otherwise.
Note: Unless a minimum field width is specified (see below), the
fillandalignvalues are meaningless. -
flagsFlags may appear in any order.
-: A '-' sign is displayed only if the value is negative (default).+: A '-' sign is displayed for negative values, a '+' sign is displayed for positive values.space: A '-' sign is displayed for negative values, afillcharacter is displayed for positive values.#: Same meaning as in printf.0: Pad with '0's after the sign. Same as specifying '0=' as thefillandalignparameters.': Display thousands-separators. For non-decimal presentation types separators will be inserted every 4 digits._: Same as', but uses an underscore as the separator.,: Same as', but uses a comma as the separator.
Note: Separators are inserted before padding is applied.
-
width ::= integer | '{' [arg-index] '}'Minimum field width. Same meaning as in printf. The default is 0.
-
precision ::= integer | '{' [arg-index] '}'For string, integral and floating-point values has the same meaning as in printf. Ignored otherwise.
Note: Precision is applied before padding.
Note: The maximum supported precision is
INT_MAX.Note: For integral types the maximum supported precision is 300.
Note: For floating-point types the maximum supported precision is 1074.
-
convAny character except digits, '
!' and '}' and any of theflags.Specifies how the argument should be presented. Defaults to
sif omitted (or if the conversion does not apply to the type of the argument being formatted).Strings (
std::string[_view]) and C-Strings (char const*):s: Nothing special.q: Quoted (like std::quoted)
Pointers (
void const*):s: Same asp.S: Same asP.p: Base 16, using lower-case digits, prefixed with '0x'. The default precision is2*sizeof(void*).P: Base 16, using upper-case digits, prefixed with '0X'. The default precision is2*sizeof(void*).i,d,u,o,x,X,b,B: As integer.
bool:s: Same ast.t: As string: "true" or "false".y: As string: "yes" or "no".o: As string: "on" or "off".
char:s: Same asc.c: Print the character.i,d,u,o,x,X,b,B: As integer.
Integers:
s: Same asd.i: Same asd.d: Display as a signed decimal integer.u: Unsigned; base 10.o: Unsigned; base 8, prefixed with '0' if#is specified (and value is non-zero).x: Unsigned; base 16, using lower-case digits, prefixed with '0x' if#is specified.X: Unsigned; base 16. using upper-case digits, prefixed with '0X' if#is specified.b: Unsigned; base 2, prefixed with '0b' if#is specified.B: Unsigned; base 2, prefixed with '0B' if#is specified.
Floating-point types:
s: Short decimal representation (either fixed- or exponential-form) which is guaranteed to round-trip.S: Same ass, but uses 'E' instead of 'e' to indicate the exponent (if any).f: Same as printf%f.F: Same as printf%F.e: Same as printf%e.E: Same as printf%E.g: Same as printf%g.G: Same as printf%G.a: Same as printf%a.A: Same as printf%A.x: Same asa, except the result is normalized (i.e. the leading digit will be '1') and a prefix is only printed if#is specified.X: Same asA, except the result is normalized (i.e. the leading digit will be '1') and a prefix is only printed if#is specified.