33、PHP 原生魅力 - 字符串 - 格式化字符串

作者: 温新

图书: 【原生 PHP 魅力】

阅读: 121

时间: 2024-09-08 00:04:54

使用 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
请登录后再评论