PHP 大会日本 2024

printf

(PHP 4, PHP 5, PHP 7, PHP 8)

printf输出格式化字符串

描述

printf(string $format, mixed ...$values): int

根据 format 生成输出。

参数

format

格式字符串由零个或多个指令组成:直接复制到结果中的普通字符(不包括 %)和转换说明,每个转换说明都会获取自己的参数。

转换说明遵循以下原型:%[argnum$][flags][width][.precision]specifier

Argnum

后跟美元符号 $ 的整数,用于指定在转换中处理哪个编号的参数。

Flags
Flag 描述
- 在给定的字段宽度内左对齐;右对齐为默认值
+ 在正数前添加加号 +;默认情况下,只有负数前添加负号。
(空格) 用空格填充结果。这是默认值。
0 仅用零填充数字的左侧。对于 s 说明符,这也可以用零填充右侧。
'(字符) 用字符 (char) 填充结果。

Width

一个整数,表示此转换应产生的字符数(最小值),或 *。如果使用 *,则宽度作为额外的整数值提供,位于说明符格式化的整数值之前。

Precision

一个句点 .,后跟一个整数或 *(可选),其含义取决于说明符

  • 对于 eEfF 说明符:这是要在小数点后打印的位数(默认情况下,为 6)。
  • 对于 gGhH 说明符:这是要打印的有效数字的最大数目。
  • 对于 s 说明符:它充当截止点,为字符串设置最大字符限制。

注意如果指定了句点但没有为精度提供显式值,则假定为 0。如果使用 *,则精度作为额外的整数值提供,位于说明符格式化的整数值之前。

Specifiers
Specifier 描述
% 一个文字百分号字符。不需要参数。
b 该参数被视为整数,并以二进制数的形式呈现。
c 该参数被视为整数,并以该 ASCII 字符的形式呈现。
d 该参数被视为整数,并以(带符号)十进制数的形式呈现。
e 该参数被视为科学计数法(例如 1.2e+2)。
E 类似于 e 说明符,但使用大写字母(例如 1.2E+2)。
f 该参数被视为浮点数,并以浮点数的形式呈现(区域感知)。
F 该参数被视为浮点数,并以浮点数的形式呈现(非区域感知)。
g

通用格式。

令 P 等于精度(如果非零),如果省略精度则为 6,如果精度为零则为 1。然后,如果使用 E 样式的转换具有 X 的指数

如果 P > X ≥ −4,则转换使用 f 样式和精度 P − (X + 1)。否则,转换使用 e 样式和精度 P − 1。

G 类似于 g 说明符,但使用 Ef
h 类似于 g 说明符,但使用 F。从 PHP 8.0.0 开始可用。
H 类似于 g 说明符,但使用 EF。从 PHP 8.0.0 开始可用。
o 该参数被视为整数,并以八进制数的形式呈现。
s 该参数被视为字符串并以字符串的形式呈现。
u 该参数被视为整数,并以无符号十进制数的形式呈现。
x 该参数被视为整数,并以十六进制数的形式呈现(使用小写字母)。
X 该参数被视为整数,并以十六进制数的形式呈现(使用大写字母)。

警告

c 类型说明符忽略填充和宽度。

警告

尝试将字符串和宽度说明符组合用于每个字符需要多个字节的字符集可能会导致意外结果。

变量将被强制转换为适合说明符的类型

类型处理
类型 Specifiers
string s
int ducoxXb
float eEfFgGhH

values

返回值

返回输出字符串的长度。

错误/异常

从 PHP 8.0.0 开始,如果参数数量为零,则会抛出 ValueError。在 PHP 8.0.0 之前,会发出 E_WARNING

从 PHP 8.0.0 开始,如果 [width] 小于零或大于 PHP_INT_MAX,则会抛出 ValueError。在 PHP 8.0.0 之前,会发出 E_WARNING

从 PHP 8.0.0 开始,如果 [precision] 小于零或大于 PHP_INT_MAX,则会抛出 ValueError。在 PHP 8.0.0 之前,会发出 E_WARNING

从 PHP 8.0.0 开始,当提供的参数少于所需参数时,会抛出 ArgumentCountError。在 PHP 8.0.0 之前,会返回 false 并发出 E_WARNING

变更日志

版本 描述
8.0.0 此函数不再在失败时返回 false
8.0.0 如果参数数量为零,则抛出 ValueError;以前此函数会发出 E_WARNING
8.0.0 如果 [width] 小于零或大于 PHP_INT_MAX,则抛出 ValueError 异常;之前此函数会发出 E_WARNING 警告。
8.0.0 如果 [precision] 小于零或大于 PHP_INT_MAX,则抛出 ValueError 异常;之前此函数会发出 E_WARNING 警告。
8.0.0 当提供的参数少于所需参数时,抛出 ArgumentCountError 异常;之前此函数会发出 E_WARNING 警告。

示例

示例 #1 printf(): 各种示例

<?php
$n
= 43951789;
$u = -43951789;
$c = 65; // ASCII 65 是 'A'

// 注意双百分号,这会打印一个字面上的 '%' 字符
printf("%%b = '%b'\n", $n); // 二进制表示
printf("%%c = '%c'\n", $c); // 打印 ASCII 字符,与 chr() 函数相同
printf("%%d = '%d'\n", $n); // 标准整数表示
printf("%%e = '%e'\n", $n); // 科学计数法
printf("%%u = '%u'\n", $n); // 正整数的无符号整数表示
printf("%%u = '%u'\n", $u); // 负整数的无符号整数表示
printf("%%f = '%f'\n", $n); // 浮点表示
printf("%%o = '%o'\n", $n); // 八进制表示
printf("%%s = '%s'\n", $n); // 字符串表示
printf("%%x = '%x'\n", $n); // 十六进制表示(小写)
printf("%%X = '%X'\n", $n); // 十六进制表示(大写)

printf("%%+d = '%+d'\n", $n); // 正整数上的符号说明符
printf("%%+d = '%+d'\n", $u); // 负整数上的符号说明符
?>

以上示例将输出

%b = '10100111101010011010101101'
%c = 'A'
%d = '43951789'
%e = '4.39518e+7'
%u = '43951789'
%u = '4251015507'
%f = '43951789.000000'
%o = '247523255'
%s = '43951789'
%x = '29ea6ad'
%X = '29EA6AD'
%+d = '+43951789'
%+d = '-43951789'

示例 #2 printf(): 字符串说明符

<?php
$s
= 'monkey';
$t = 'many monkeys';

printf("[%s]\n", $s); // 标准字符串输出
printf("[%10s]\n", $s); // 使用空格右对齐
printf("[%-10s]\n", $s); // 使用空格左对齐
printf("[%010s]\n", $s); // 零填充也适用于字符串
printf("[%'#10s]\n", $s); // 使用自定义填充字符 '#'
printf("[%'#*s]\n", 10, $s); // 将填充宽度作为附加参数提供
printf("[%10.9s]\n", $t); // 右对齐,但截断为 8 个字符
printf("[%-10.9s]\n", $t); // 左对齐,但截断为 8 个字符
?>

以上示例将输出

[monkey]
[    monkey]
[monkey    ]
[0000monkey]
[####monkey]
[####monkey]
[ many monk]
[many monk ]

参见

添加注释

用户贡献的注释 7 条注释

dhosek at excite dot com
25 年前
小心
printf ("(9.95 * 100) = %d \n", (9.95 * 100));

'994'

第一个 %d 通过截断将浮点数转换为整数。

其次,浮点数以其微小的舍入误差而臭名昭著。
php at mole dot gnubb dot net
19 年前
[编辑注:或者只使用 vprintf...]

如果你想做类似 <?php printf('There is a difference between %s and %s', array('good', 'evil')); ?>(这不起作用)而不是 <?php printf('There is a difference between %s and %s', 'good', 'evil'); ?>,你可以使用这个函数

<?php
function printf_array($format, $arr)
{
return
call_user_func_array('printf', array_merge((array)$format, $arr));
}
?>

使用方法如下
<?php
$goodevil
= array('good', 'evil');
printf_array('There is a difference between %s and %s', $goodevil);
?>
它将打印
There is a difference between good and evil
simon dot patrick at cantab dot net
3 个月前
关于 printf 需要注意的一些事项
1. 说明符 g(或 G)的定义通常被错误地说明为“使用 e 或 f(或 E 或 f),无论哪个导致字符串更短”。正确的规则在文档中给出,它并不总是给出此结果。
2. 对于 g/G/h/H,小数点后的尾随零将被删除(但小数点后的零不会,在 e/E 样式中)。
3. g/G 依赖于区域设置来确定生成 e/E 还是 f 样式。
4. 对于 b/o/x/X/u(即,除了 d 之外的所有整数样式),负值的显示结果是该数字的二进制补码形式,2**32 + v,其中 v 是(负)值。
deekayen at hotmail dot com
23 年前
您可以使用此函数来格式化数字中的小数位数

$num = 2.12;
printf("%.1f",$num);

打印

2.1

另请参阅:number_format()
maybird99 at yahoo dot com
22 年前
与其编写一个函数来精确地舍入浮点数(我们称之为“x”),不如向 x 添加一个小的数字然后截断它……
例如:如果你想舍入到最接近的整数,只需向 x 添加 0.5 然后截断它。如果 x=12.6,则它将计算 13.1,并将其截断为 13。如果 x=14.4,则它将计算 14.9 并将其截断为 14。
Mario M. Junior
2 年前
为了提供更友好的用户界面,您可以在终端打印文本时使用颜色。

p('Ordinary text.');
p('Warning: Check this out...', 'info');
p('Ops! Something went wrong.', 'error');
p('Yeah... done!', 'success');

function p($text, $style = '', $newLine = true) {

$styles = array(


'成功' => "\033[0;32m%s\033[0m",
'错误' => "\033[31;31m%s\033[0m",
'信息' => "\033[33;33m%s\033[0m",

'黑色' => "\033[0;30m%s\033[0m",
'红色' => "\033[0;31m%s\033[0m",
'绿色' => "\033[0;32m%s\033[0m",
'黄色' => "\033[0;33m%s\033[0m",
'蓝色' => "\033[0;34m%s\033[0m",
'紫色' => "\033[0;35m%s\033[0m",
'青色' => "\033[0;36m%s\033[0m",
'灰色' => "\033[0;37m%s\033[0m",
'深灰色' => "\033[1;30m%s\033[0m",

'加粗红色' => "\033[1;31m%s\033[0m",
'加粗绿色' => "\033[1;32m%s\033[0m",
'加粗黄色' => "\033[1;33m%s\033[0m",
'加粗蓝色' => "\033[1;34m%s\033[0m",
'加粗紫色' => "\033[1;35m%s\033[0m",
'加粗青色' => "\033[1;36m%s\033[0m",
'加粗白色' => "\033[1;37m%s\033[0m",

'黑色背景' => "\033[40;1;37m%s\033[0m",
'红色背景' => "\033[41;1;37m%s\033[0m",
'绿色背景' => "\033[42;1;37m%s\033[0m",
'黄色背景' => "\033[43;1;37m%s\033[0m",
'蓝色背景' => "\033[44;1;37m%s\033[0m",
'紫色背景' => "\033[45;1;37m%s\033[0m",
'青色背景' => "\033[46;1;37m%s\033[0m",
'灰色背景' => "\033[47;1;37m%s\033[0m",

'下划线' => "\033[4;37m%s\033[0m",
'反显' => "\033[7;37m%s\033[0m",
'闪烁' => "\033[5;37m%s\033[0m",
);

$format = '%s';

如果 (isset($styles[$style])) {
$format = $styles[$style];
}

如果 ($newLine) {
$format .= PHP_EOL;
}

printf($format, $text);
}
steve at myschoolsystems dot com
3 年前
要将美元值格式化为 $123.00,否则可能显示为 $123,请使用以下方法

print ('$'); // 美元符号位于答案前面
printf ('%.2f',$price);
To Top