fprintf outchan format arg1 ... argN formats the arguments
arg1 to argN according to the format string format, and
outputs the resulting string on the channel outchan.

The format string is a character string which contains two types of
objects: plain characters, which are simply copied to the output
channel, and conversion specifications, each of which causes
conversion and printing of arguments.

Conversion specifications have the following form:

% [flags] [width] [.precision] type

In short, a conversion specification consists in the % character,
followed by optional modifiers and a type which is made of one or
two characters.

The types and their meanings are:

d, i: convert an integer argument to signed decimal.

u, n, l, L, or N: convert an integer argument to
unsigned decimal. Warning: n, l, L, and N are
used for scanf, and should not be used for printf.

nd, ni, nu, nx, nX, no: convert a nativeint argument to
the format specified by the second letter.

Ld, Li, Lu, Lx, LX, Lo: convert an int64 argument to
the format specified by the second letter.

a: user-defined printer. Take two arguments and apply the
first one to outchan (the current output channel) and to the
second argument. The first argument must therefore have type
out_channel ->'b -> unit and the second 'b.
The output produced by the function is inserted in the output of
fprintf at the current point.

t: same as %a, but take only one argument (with type
out_channel -> unit) and apply it to outchan.

{ fmt %}: convert a format string argument. The argument must
have the same type as the internal format string fmt.

( fmt %): format string substitution. Take a format string
argument and substitute it to the internal format string fmt
to print following arguments. The argument must have the same
type as the internal format string fmt.

!: take no argument and flush the output.

%: take no argument and output one % character.

@: take no argument and output one @ character.

,: take no argument and do nothing.

The optional flags are:

-: left-justify the output (default is right justification).

0: for numerical conversions, pad with zeroes instead of spaces.

+: for signed numerical conversions, prefix number with a +
sign if positive.

space: for signed numerical conversions, prefix number with a
space if positive.

#: request an alternate formatting style for numbers.

The optional width is an integer indicating the minimal
width of the result. For instance, %6d prints an integer,
prefixing it with spaces to fill at least 6 characters.

The optional precision is a dot . followed by an integer
indicating how many digits follow the decimal point in the %f,
%e, and %E conversions. For instance, %.4f prints a float with
4 fractional digits.

The integer in a width or precision can also be specified as
*, in which case an extra integer argument is taken to specify
the corresponding width or precision. This integer argument
precedes immediately the argument to print.
For instance, %.*f prints a float with as many fractional
digits as the value of the argument given before the float.