33、PHP 原生魅力 - 字符串 - 格式化字符串
使用 sprintf() 函数格式化字符串
sprintf() 函数通过使用模板结构来帮助创建字符串。
<?php
$template = "Hi %s, how are you?";
$name = "John";
echo sprintf($template, $name);
输出如下:
$ php 33-sprintf.php
Hi John, how are you?
%s
作为一个字符串占位符。它表示在当前位置,根据此格式,我打算将占位符替换为一个值。该值在 sprintf()
函数调用中作为第二个参数定义。
同样地,你可以使用 %d
占位符来表示数字:
<?php
$name = 'John';
$age = 25;
$string = sprintf('Hi %s, you are %d years old.', $name, $age);
echo $string;
输出如下:
$ php 33-sprintf.php
Hi John, you are 25 years old.
在最后一个例子中,通过所示的方法,值的顺序在占位符替换中起着关键作用。首先声明的值 $name
用于替换字符串中找到的第一个占位符。第二个声明的值 $age
用于替换第二个占位符,依此类推。
还有可能使用索引来声明占位符:
<?php
$name = 'John';
$age = 25;
$string = sprintf('Hi %s, you are %d years old. Goodbye my friend %1$s', $name, $age);
echo $string;
输出如下:
$ php 33-sprintf.php
Hi John, you are 25 years old. Goodbye my friend John
在最后一个示例场景中,%1$s
占位符中的 1$
表示“从 sprintf() 参数列表中获取第一个值”。第一个值是 $name
,
因此,sprintf() 函数返回的字符串为:
sprintf('Hi %s, you are %d years old. Goodbye my friend %1$s', $name, $age);
will be: “Hi John, you are 25 years old. Goodbye my friend John”.
填充
如果你需要在替换占位符时添加填充字符,你可以定义替换值总共有多少字符。
例如,如果你想在定义的值的开始处添加空格字符,以获得一个预定义长度的字符串,比如说 10 个字符,你可以使用这样的语法:%10s
。
<?php
$name = 'John';
$age = 25;
echo sprintf('---%10s: %s---', '名字', $name);
echo PHP_EOL;
echo sprintf('---%10s:%d---','年龄', $age);
输出如下:
$ php 33-sprintf.php
--- 名字: John---
--- 年龄:25---
你也可以定义填充字符。如果你想使用下划线作为填充,你需要使用'_'(单引号和所需字符)。
<?php
echo sprintf("%'_10s", '美丽');
// ____美丽
默认情况下,填充字符会添加在字符串之前。因此,%10s 应用于长度为 9 个字符的字符串 “Something”,只会在这个字符串前加上 1 个空格。
<?php
echo sprintf('-%10s-', "Something");
// - Something-
如果你想在字符串的末尾添加填充字符,可以在字符数量前使用破折号 -
字符:
<?php
echo sprintf('*%-25s*', "Left with spaces");
// *Left with spaces *
因此,结合对齐(-)和填充字符(')的定义:
<?php
// 使用单引号在%字符后设置填充字符(下划线)
echo sprintf("*%'_25s*", "右侧带下划线") . PHP_EOL;
// 输出结果为:*___右侧带下划线*
// 设置填充字符并使文本左对齐
echo sprintf("*%'_-25s*", "左侧带下划线") . PHP_EOL;
// 输出结果为:*左侧带下划线__________*/
如果结果字符串长度大于指定的总填充字符数量,默认情况下结果字符串不会被截断。
例如,对于字符串 “Something”,如果你使用 %2s
格式化,那么填充将会被忽略。换句话说,"Something" 会完整输出,而不会被缩短到只保留两个字符加上填充。
<?php
echo sprintf("*%2s*", "Something");
//*Something*
如果要强制并截断结果字符串,可以使用点表示法:
echo sprintf("*%2.3s*", "Something");
//*Som*
数字(整数)
除了格式化字符串的能力,它也可以格式化数字,如整数,浮点数,小数等。对于格式化整数,您可以使用 %d 占位符:
<?php
echo sprintf("*%d*", 512);
//*512*
即使可以通过 %d 占位符使用数字,sprintf() 函数返回的始终是一个字符串。
<?php
$result = sprintf("*%d*", 512);
echo gettype($result);
// string
如果你想在定义的数字值前添加空格字符,以得到一个预定义长度的字符串,比如说 8 个字符,你可以使用这样的语法:%8d。
<?php
echo sprintf("*%8d*", 512);
//* 512*
你也可以自定义填充字符。如果你想使用 '0' 作为填充字符,必须这样写:%'08d。默认情况下,填充字符会添加在值的前面。因此,如果将 %'08d 应用于数字 512(长度为3的字符),它只会在这个值 512 之前放置五个 '0 '字符。
<?php
echo sprintf("*%'08d*", 512);
//*00000512*
如果指定的填充长度小于数值本身所占的字符数,那么填充将被忽略。
<?php
echo sprintf("*%2d*", 512);
//*512*
如果你想在数值的末尾添加填充字符,可以在字符数量前使用破折号 -
符号。例如,你可以通过 -
符号实现“在末尾填充”,以总共达到 8 位数字(d):
<?php
echo sprintf("*%-8d*", 512);
// *512 *
如果你希望自定义填充字符,将默认的空格字符替换为下划线 _
,可以使用单引号 '
:
<?php
echo sprintf("*%-'_8d*", 512);
// 输出:*512_____*
详述 %-'_8d
中所有字符的意义:
- %- :此处在占位符起始;
- ' :使用自定义填充字符;
- _ :作为填充的自定义字符;
- 8 :最终字符串的总长度;
- d :源值为数字类型。
如果你有一系列值,并需要按位置选取特定值,可以使用 $
符号。例如,如要使用第二个值,可以写作 2$
。
<?php
echo sprintf('*%2$8d*', 512, 1024);
//* 1024*
当然,你可以联合收割机其他指令,试试这个:
<?php
echo sprintf("*%2$-'_8d*", 512,1024);
//*1024____*
数字(浮点数)
如果你处理的是浮点数,可能还想控制小数点后的位数。浮点数默认显示 6 位小数:
<?php
echo sprintf('*%f*', 1.25);
// 输出:*1.250000*
限制浮点数显示为 3 位小数:
<?php
echo sprintf("*%5.3f*", 1.25);
// 输出:*1.250*
浮点数四舍五入至 3 位小数:
<?php
echo sprintf("*%5.3f*", 1.2519);
// 输出:*1.252*
结合多个指令,你可以从浮点数(四舍五入至 3 位小数)生成字符串,并以前导 0 扩展至 10 位总长度:
<?php
echo sprintf("*%'010.3f*", 1.2519);
// 输出:*000001.252*
以及更复杂的例子:
<?php
echo sprintf("*%'_-10.3f*", 1.2519);
// 输出:*1.252_____*
各部分说明:
-
%
:表示占位符; -
'_-
:下划线_
作为填充字符,并指定填充在值的末尾; -
10
:最终字符串的总长度; -
.3
:保留3位小数; -
f
:表明值为浮点数。
格式化速查表
格式化内容 | 字符 | 占位符 |
---|---|---|
普通字符串 | %s |
|
使用 10 个空格填充的字符串 | 10 |
%10s |
使用 10 个下划线填充的字符串 | ’_ |
%‘_10s |
左对齐并使用 10 个下划线填充的字符串 | - |
%’_-10s |
长字符串填充,并在过长时截断 | . |
%2.2s |
整数 | %d |
|
带有固定宽度的整数(8 个空格) | 8 |
%8d |
左对齐并使用空格填充的整数 | - |
%-8d |
左对齐并使用自定义字符填充的整数 | ’0 |
%‘08d |
带有小数的浮点数 | %f |
|
总长度为 5 位的浮点数,包括 3 位小数 | 5.3 |
%5.3f |
3 位小数前缀 0 的浮点数(共 10 位) | ’010.3 |
%‘010.3f |