(gawk.info.gz) Printf Ordering

Info Catalog (gawk.info.gz) String Extraction (gawk.info.gz) Translator i18n (gawk.info.gz) I18N Portability
 
 10.4.2 Rearranging `printf' Arguments
 -------------------------------------
 
 Format strings for `printf' and `sprintf()' ( Printf) present a
 special problem for translation.  Consider the following:(1)
 
      printf(_"String `%s' has %d characters\n",
                string, length(string)))
 
    A possible German translation for this might be:
 
      "%d Zeichen lang ist die Zeichenkette `%s'\n"
 
    The problem should be obvious: the order of the format
 specifications is different from the original!  Even though `gettext()'
 can return the translated string at runtime, it cannot change the
 argument order in the call to `printf'.
 
    To solve this problem, `printf' format specifiers may have an
 additional optional element, which we call a "positional specifier".
 For example:
 
      "%2$d Zeichen lang ist die Zeichenkette `%1$s'\n"
 
    Here, the positional specifier consists of an integer count, which
 indicates which argument to use, and a `$'. Counts are one-based, and
 the format string itself is _not_ included.  Thus, in the following
 example, `string' is the first argument and `length(string)' is the
 second:
 
      $ gawk 'BEGIN {
      >     string = "Dont Panic"
      >     printf _"%2$d characters live in \"%1$s\"\n",
      >                         string, length(string)
      > }'
      -| 10 characters live in "Dont Panic"
 
    If present, positional specifiers come first in the format
 specification, before the flags, the field width, and/or the precision.
 
    Positional specifiers can be used with the dynamic field width and
 precision capability:
 
      $ gawk 'BEGIN {
      >    printf("%*.*s\n", 10, 20, "hello")
      >    printf("%3$*2$.*1$s\n", 20, 10, "hello")
      > }'
      -|      hello
      -|      hello
 
      NOTE: When using `*' with a positional specifier, the `*' comes
      first, then the integer position, and then the `$'.  This is
      somewhat counterintuitive.
 
    `gawk' does not allow you to mix regular format specifiers and those
 with positional specifiers in the same string:
 
      $ gawk 'BEGIN { printf _"%d %3$s\n", 1, 2, "hi" }'
      error--> gawk: cmd. line:1: fatal: must use `count$' on all formats or none
 
      NOTE: There are some pathological cases that `gawk' may fail to
      diagnose.  In such cases, the output may not be what you expect.
      It's still a bad idea to try mixing them, even if `gawk' doesn't
      detect it.
 
    Although positional specifiers can be used directly in `awk'
 programs, their primary purpose is to help in producing correct
 translations of format strings into languages different from the one in
 which the program is first written.
 
    ---------- Footnotes ----------
 
    (1) This example is borrowed from the GNU `gettext' manual.
 
Info Catalog (gawk.info.gz) String Extraction (gawk.info.gz) Translator i18n (gawk.info.gz) I18N Portability
automatically generated by info2html