% File src/library/base/man/sprintf.Rd
% Part of the R package, https://www.R-project.org
% Copyright 1995-2021 R Core Team
% Distributed under GPL 2 or later

\name{sprintf}
\alias{sprintf}
\alias{gettextf}
\title{Use C-style String Formatting Commands}
\description{
  A wrapper for the C function \code{sprintf}, that returns a character
  vector containing a formatted combination of text and variable values.
}
\usage{
sprintf(fmt, \dots)
gettextf(fmt, \dots, domain = NULL, trim = TRUE)
}
\arguments{
  \item{fmt}{a character vector of format strings, each of up to 8192 bytes.}
  \item{\dots}{values to be passed into \code{fmt}.  Only logical,
    integer, real and character vectors are supported, but some coercion
    will be done: see the \sQuote{Details} section. Up to 100.}
  \item{trim, domain}{see \code{\link{gettext}}.}
}
\details{
  \code{sprintf} is a wrapper for the system \code{sprintf} C-library
  function.  Attempts are made to check that the mode of the values
  passed match the format supplied, and \R's special values (\code{NA},
  \code{Inf}, \code{-Inf} and \code{NaN}) are handled correctly.

  \code{gettextf} is a convenience function which provides C-style
  string formatting with possible translation of the format string.

  The arguments (including \code{fmt}) are recycled if possible a whole
  number of times to the length of the longest, and then the formatting
  is done in parallel.  Zero-length arguments are allowed and will give
  a zero-length result.  All arguments are evaluated even if unused, and
  hence some types (e.g., \code{"symbol"} or \code{"language"}, see
  \code{\link{typeof}}) are not allowed. Arguments unused by \code{fmt}
  result in a warning. (The format \code{\%.0s} can be used to
  \dQuote{skip} an argument.)

  The following is abstracted from
  \bibcite{Kernighan and Ritchie (1988)}:
  however the actual implementation will follow the C99
  standard and fine details (especially the behaviour under user error)
  may depend on the platform. References to numbered arguments come from
  POSIX.

  The string \code{fmt} contains normal characters,
  which are passed through to the output string, and also conversion
  specifications which operate on the arguments provided through
  \code{\dots}.  The allowed conversion specifications start with a
  \code{\%} and end with one of the letters in the set
  \code{aAdifeEgGosxX\%}.  These letters denote the following types:

  \describe{
    \item{\code{d}, \code{i}, \code{o}, \code{x}, \code{X}}{Integer
      value, \code{o} being octal, 
      \code{x} and \code{X} being hexadecimal (using the same case for
      \code{a-f} as the code).  Numeric variables with exactly integer
      values will be coerced to integer.  Formats \code{d} and \code{i}
      can also be used for logical variables, which will be converted to
      \code{0}, \code{1} or \code{NA}.
    }
    \item{\code{f}}{Double precision value, in \dQuote{\bold{f}ixed
        point} decimal notation of the form \samp{"[-]mmm.ddd"}.  The number of
      decimal places ("d") is specified by the precision: the default is 6;
      a precision of 0 suppresses the decimal point.  Non-finite values
      are converted to \code{NA}, \code{NaN} or (perhaps a sign followed
      by) \code{Inf}.
    }
    \item{\code{e}, \code{E}}{Double precision value, in
      \dQuote{\bold{e}xponential} decimal notation of the
      form \code{[-]m.ddde[+-]xx} or \code{[-]m.dddE[+-]xx}.
    }
    \item{\code{g}, \code{G}}{Double precision value, in \code{\%e} or
      \code{\%E} format if the exponent is less than -4 or greater than or
      equal to the precision, and \code{\%f} format otherwise.
      (The precision (default 6) specifies the number of
      \emph{significant} digits here, whereas in \code{\%f, \%e}, it is
      the number of digits after the decimal point.)
    }
    \item{\code{a}, \code{A}}{Double precision value, in binary notation
      of the form \code{[-]0xh.hhhp[+-]d}.  This is a binary fraction
      expressed in hex multiplied by a (decimal) power of 2.  The number
      of hex digits after the decimal point is specified by the precision:
      the default is enough digits to represent exactly the internal
      binary representation.  Non-finite values are converted to \code{NA},
      \code{NaN} or (perhaps a sign followed by) \code{Inf}.  Format
      \code{\%a} uses lower-case for \code{x}, \code{p} and the hex
      values: format \code{\%A} uses upper-case.

      This should be supported on all platforms as it is a feature of C99.
      The format is not uniquely defined: although it would be possible
      to make the leading \code{h} always zero or one, this is not
      always done.  Most systems will suppress trailing zeros, but a few
      do not.  On a well-written platform, for normal numbers there will
      be a leading one before the decimal point plus (by default) 13
      hexadecimal digits, hence 53 bits.  The treatment of denormalized
      (aka \sQuote{subnormal}) numbers is very platform-dependent.
    }
    \item{\code{s}}{Character string.  Character \code{NA}s are
      converted to \code{"NA"}.
    }
    \item{\code{\%}}{Literal \code{\%} (none of the extra formatting
      characters given below are permitted in this case).
    }
  }
  Conversion by \code{\link{as.character}} is used for non-character
  arguments with \code{s} and by \code{\link{as.double}} for
  non-double arguments with \code{f, e, E, g, G}.  NB: the length is
  determined before conversion, so do not rely on the internal
  coercion if this would change the length.  The coercion is done only
  once, so if \code{length(fmt) > 1} then all elements must expect the
  same types of arguments.

  In addition, between the initial \code{\%} and the terminating
  conversion character there may be, in any order:

  \describe{
    \item{\code{m.n}}{Two numbers separated by a period, denoting the
      field width (\code{m}) and the precision (\code{n}).}
    \item{\code{-}}{Left adjustment of converted argument in its field.}
    \item{\code{+}}{Always print number with sign: by default only
      negative numbers are printed with a sign.}
    \item{a space}{Prefix a space if the first character is not a sign.}
    \item{\code{0}}{For numbers, pad to the field width with leading
      zeros. For characters, this zero-pads on some platforms and is
      ignored on others.}
    \item{\code{#}}{specifies \dQuote{alternate output} for numbers, its
      action depending on the type:
      For \code{x} or \code{X}, \code{0x} or \code{0X} will be prefixed
      to a non-zero result.  For \code{e}, \code{e}, \code{f}, \code{g}
      and \code{G}, the output will always have a decimal point; for
      \code{g} and \code{G}, trailing zeros will not be removed.
    }
  }
  Further, immediately after \code{\%} may come \code{1$} to \code{99$}
  to refer to a numbered argument: this allows arguments to be
  referenced out of order and is mainly intended for translators of
  error messages.  If this is done it is best if all formats are
  numbered: if not the unnumbered ones process the arguments in order.
  See the examples.  This notation allows arguments to be used more than
  once, in which case they must be used as the same type (integer,
  double or character).

  A field width or precision (but not both) may be indicated by an
  asterisk \code{*}: in this case an argument specifies the desired
  number.  A negative field width is taken as a '-' flag followed by a
  positive field width.  A negative precision is treated as if the
  precision were omitted.  The argument should be integer, but a double
  argument will be coerced to integer.

  There is a limit of 8192 bytes on elements of \code{fmt}, and on
  strings included from a single \code{\%}\emph{letter} conversion
  specification.

  Field widths and precisions of \code{\%s} conversions are interpreted
  as bytes, not characters, as described in the C standard.
  
  The C doubles used for \R numerical vectors have signed zeros, which
  \code{sprintf} may output as \code{-0}, \code{-0.000} \dots.
}
%% (for #) This is from Kernighan & Ritchie, p. 243:
%% For \code{o}, the first digit will be zero.


\value{
  A character vector of length that of the longest input.  If any
  element of \code{fmt} or any character argument is declared as UTF-8,
  the element of the result will be in UTF-8 and have the encoding
  declared as UTF-8.  Otherwise it will be in the current locale's
  encoding.
}

\section{Warning}{
  The format string is passed down the OS's \code{sprintf} function, and
  incorrect formats can cause the latter to crash the \R process .  \R
  does perform sanity checks on the format, but not all possible user
  errors on all platforms have been tested, and some might be terminal.

  The behaviour on inputs not documented here is \sQuote{undefined},
  which means it is allowed to differ by platform.
}

\references{
  Kernighan, B. W. and Ritchie, D. M. (1988)
  \emph{The C Programming Language.} Second edition, Prentice Hall.
  Describes the format options in table B-1 in the Appendix.

  The C Standards, especially ISO/IEC 9899:1999 for \sQuote{C99}.  Links
  can be found at
  \url{https://developer.r-project.org/Portability.html}.

  \url{https://pubs.opengroup.org/onlinepubs/9699919799/functions/snprintf.html }
  for POSIX extensions such as numbered arguments.

  \command{man sprintf} on a Unix-alike system.
}

\author{
  Original code by Jonathan Rougier.
}

\seealso{
  \code{\link{formatC}} for a way of formatting vectors of numbers in a
  similar fashion.

  \code{\link{paste}} for another way of creating a vector combining
  text and values.

  \code{\link{gettext}} for the mechanisms for the automated translation
  of text.
}

% Escape all the '%' here !
\examples{
## be careful with the format: most things in R are floats
## only integer-valued reals get coerced to integer.

sprintf("\%s is \%f feet tall\n", "Sven", 7.1)      # OK
try(sprintf("\%s is \%i feet tall\n", "Sven", 7.1)) # not OK
    sprintf("\%s is \%i feet tall\n", "Sven", 7  )  # OK

## use a literal \% :

sprintf("\%.0f\%\% said yes (out of a sample of size \%.0f)", 66.666, 3)

## various formats of pi :

sprintf("\%f", pi)
sprintf("\%.3f", pi)
sprintf("\%1.0f", pi)
sprintf("\%5.1f", pi)
sprintf("\%05.1f", pi)
sprintf("\%+f", pi)
sprintf("\% f", pi)
sprintf("\%-10f", pi) # left justified
sprintf("\%e", pi)
sprintf("\%E", pi)
sprintf("\%g", pi)
sprintf("\%g",   1e6 * pi) # -> exponential
sprintf("\%.9g", 1e6 * pi) # -> "fixed"
sprintf("\%G", 1e-6 * pi)

## no truncation:
sprintf("\%1.f", 101)

## re-use one argument three times, show difference between \%x and \%X
xx <- sprintf("\%1$d \%1$x \%1$X", 0:15)
xx <- matrix(xx, dimnames = list(rep("", 16), "\%d\%x\%X"))
noquote(format(xx, justify = "right"))

## More sophisticated:

sprintf("min 10-char string '\%10s'",
        c("a", "ABC", "and an even longer one"))

n <- 1:18
sprintf(paste0("e with \%2d digits = \%.", n, "g"), n, exp(1))

\dontdiff{## Platform-dependent bad example: may pad with spaces or zeroes
sprintf("\%09s", month.name)}

## Using arguments out of order
sprintf("second \%2$1.0f, first \%1$5.2f, third \%3$1.0f", pi, 2, 3)

## Using asterisk for width or precision
sprintf("precision \%.*f, width '\%*.3f'", 3, pi, 8, pi)

## Asterisk and argument re-use, 'e' example reiterated:
sprintf("e with \%1$2d digits = \%2$.*1$g", n, exp(1))

## re-cycle arguments
sprintf("\%s \%d", "test", 1:3)

## binary output showing rounding/representation errors
x <- seq(0, 1.0, 0.1); y <- c(0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1)
cbind(x, sprintf("\%a", x), sprintf("\%a", y))
}
\keyword{print}
\keyword{character}
