原文在 2009/11/19 发表于 http://www.elated.com/articles/formatting-php-strings-printf-sprintf/

和其他许多编程语言一样, PHP 也有功能强大的 `printf()` 和 `sprintf()` 函数, 它们提供了很多格式化字符串的方式. 当你想要某些数据更易读, 或者需要传递数据给其他程式的时候, 这两个函数很有用.

PHP 也有许多专门用途的格式化字符串的函数 - 比如 `date()` 函数, 适合用于格式化日期字符串. 而 `printf()` 和 `sprintf()` 则适合更为通用的格式化.

这篇教程就会教你如何使用 `printf()` 和 `sprintf()` 来格式化字符串.

# 一个简单的 `printf()` 示例

了解 `printf()` 的最简单方式就是通过示例. 下面这个例子打印一个包含了两个数字的字符串:

    <?php
    // 打印 "Australia comprises 6 states and 10 territories"
    printf( "Australia comprises %d states and %d territories", 6, 10 );
    ?>

注意这个字符串在被打印出的时候, 第一个 `%d` 被第二个参数 `6` 替换, 第二个 `%d` 则被第三个参数 `10` 替换. 其工作原理即:

- 第一个参数必须是一个字符串, 我们称之为目标字符串. 目标字符串包含普通的字符, 和一些可选的格式说明符 (比如 `%d`)

- 所有格式说明符都以 `%` 开头. 它按对应的顺序以特定方式格式化目标字符串之后的参数, 然后将其插入到最终的字符串中, 并显示到网页.

NOTE: 如果想要打印 `%` 符, 使用 `%%`.

#

    <?php
    printf( "Here's the number %s as a float (%f), a binary integer (%b), an octal integer (%o), and a hex integer (%x).", 543.21, 543.21, 543.21, 543.21, 543.21 );
    ?>

这段代码会输出:

    Here's the number 543.21 as a float (543.210000), a binary integer (1000011111), an octal integer (1037), and a hex integer (21f).

#

    <?php
    printf( "%d", 36 );   // 输出 "36"
    printf( "%d", -36 );  // 输出 "-36"
    ?>

如果你也想让 `printf()` 在正数前加符号, 可以在类型说明符前指定一个符号说明符 `+`:

    <?php
    printf( "%+d", 36 );   // 输出 "+36"
    printf( "%+d", -36 );  // 输出 "-36"
    ?>

#

    <?php
    printf( "%04d", 12 );          // 输出 "0012"
    printf( "%04d", 1234 );        // 输出 "1234"
    printf( "%04d", 12345 );       // 输出 "12345"
    printf( "% 10s", "Hello" );    // 输出 "     Hello"
    printf( "%10s", "Hello" );     // 输出 "     Hello"
    printf( "%'*10s", "Hello" );   // 输出 "*****Hello"
    printf( "%'*-10s", "Hello" );  // 输出 "Hello*****"
    ?>

留意第三个示例, 填充说明符并不会导致目标字符串被截断为 4 个字符. 填充只会在必要处增加字符

#

    <?php
    printf( "%f", 123.456 );  // 输出 "123.456000"
    ?>

如果要指定不同的精度, 就要用到精度说明符了. 精度说明符是一个 `.` 号后跟一个数字, 并应放到类型说明符之前. 如:

    <?php
    printf( "%.2f", 123.456 );   // 输出 "123.46"
    printf( "%.10f", 123.456 );  // 输出 "123.4560000000"
    printf( "%.0f", 123.456 );   // 输出 "123"
     ?>

如果你既指定了填充说明符又指定了精度说明符, `printf()` 会将整个数字(包括整数和小数部分)填充到指定长度:

    <?php
    printf( "%08.2f", 123.456 );  // 输出 "00123.46"
     ?>

如果你同时使用 `s` 类型说明符和精度说明符, `printf()` 会截断目标字符串到指定的长度:

    <?php
    printf( "%.2s", "Hello" );  // 输出 "He"
     ?>

#

    <?php
    // 输出 "Australia comprises 10 territories and 6 states"
    printf( 'Australia comprises %2$d territories and %1$d states', 6, 10 );
     ?>

在上面的例子中, 第一个格式说明符是 `%2$d`. 意即: "将目标字符串后的第二个参数作为十进制整数格式化". 第二个格式说明符 `%1$d` 即: "将目标字符串后的第一个参数作为十进制整数格式化". 这样, 参数便以不同与默认的顺序格式化.

在上面的例子中, 格式字符串使用单引号而非双引号包围. 这样是为了阻止 `$` 符号被 PHP 解释为变量名.

#

    <?php
    $result = sprintf( "Australia comprises %d states and %d territories", 6, 10 );

    // 输出 "Australia comprises 6 states and 10 territories"
    echo $result;
     ?>

# `fprintf()`, 用于将结果写到流(如文件). 还有 `vprintf()`/`vsprintf()`/`vfprintf()`, 它们使用一个数组参数, 而非参数列表.