2016-08-19
Victor Zverovich, victor.zverovich@gmail.com
Introduction
Design
Format String Syntax
Locale Support
Wording
References
This paper proposes a new text formatting functionality that can be used as a
safe and extensible alternative to the printf
family of functions.
It is intended to complement the existing C++ I/O streams library and reuse
some of its infrastructure such as overloaded insertion operators for
user-defined types.
Example:
std::string message = std::format("The answer is {}.", 42)
Variations of the printf format string syntax are arguably the most popular
among the programming languages and C++ itself inherits printf
from C [1]. The advantage of the printf syntax is that many
programmers are familiar with it. However, in its current form it has a number
of issues:
hh
, h
, l
,
j
, etc. are used only to convey type information.
They are redundant in type-safe formatting and would unnecessarily
complicate specification and parsing.'%'
in a custom format specifier, e.g. for
put_time
-like time formatting, poses difficulties.Although it is possible to address these issues, this will break compatibility and can potentially be more confusing to users than introducing a different syntax.
Therefore we propose a new syntax based on the ones used in Python [3], the .NET family of languages [4], and Rust [5]. This syntax uses'{'
and
'}'
as replacement field delimiters instead of '%'
and it is described in details in TODO:link. Here are some of the advantages:
The syntax is expressive enough to enable translation, possibly automated, of most printf format strings. TODO: table of correspondence between printf and the new syntax
TODO
TODO
The ideas proposed in this paper have been implemented in the open-source fmt library. TODO: link
[1]
The fprintf
function. ISO/IEC 9899:2011. 7.21.6.1.
[2]
fprintf, printf, snprintf, sprintf - print formatted output. The Open
Group Base Specifications Issue 6 IEEE Std 1003.1, 2004 Edition.
[3]
6.1.3. Format String Syntax. Python 3.5.2 documentation.
[4]
String.Format Method. .NET Framework Class Library.
[5]
Module std::fmt
. The Rust Standard Library.