小心
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
第一个 %d 通过截断将浮点数转换为整数。
第二个浮点数以微小的舍入误差而闻名。
(PHP 4, PHP 5, PHP 7, PHP 8)
printf — 输出格式化的字符串
format
格式字符串由零个或多个指令组成:直接复制到结果的普通字符(不包括 %
)和转换说明符,每个转换说明符都会获取自己的参数。
转换说明符遵循以下原型:%[argnum$][flags][width][.precision]specifier
。
一个整数后跟美元符号 $
,用于指定在转换中处理哪个数字参数。
Flag | 描述 |
---|---|
- |
在给定的字段宽度内左对齐;右对齐是默认值 |
+ |
在正数前面加上加号 + ;默认情况下,只有负数前面加上负号。 |
(空格) |
用空格填充结果。这是默认值。 |
0 |
仅用零填充数字左侧。对于 s 说明符,这也可以用零填充右侧。 |
' (字符) |
用字符 (char) 填充结果。 |
一个整数,表示此转换应产生的字符数(最小值),或 *
。如果使用 *
,则宽度将作为在由说明符格式化的一个之前提供的附加整数提供。
一个句点 .
,后面可选择跟随一个整数或 *
,其含义取决于说明符
e
、E
、f
和 F
说明符:这是小数点后要打印的位数(默认情况下,为 6)。
g
、G
、h
和 H
说明符:这是要打印的有效位数的最大值。
s
说明符:它充当截止点,为字符串设置最大字符限制。
注意: 如果指定句点但不显式指定精度值,则假定为 0。如果使用
*
,则精度将作为在由说明符格式化的一个之前提供的附加整数提供。
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 说明符类似,但使用 E 和 f 。 |
h |
与 g 说明符类似,但使用 F 。自 PHP 8.0.0 起可用。 |
H |
与 g 说明符类似,但使用 E 和 F 。自 PHP 8.0.0 起可用。 |
o |
参数被视为整数并以八进制数形式显示。 |
s |
参数被视为字符串并以字符串形式显示。 |
u |
参数被视为整数并以无符号十进制数形式显示。 |
x |
参数被视为整数并以十六进制数形式显示(使用小写字母)。 |
X |
参数被视为整数并以十六进制数形式显示(使用大写字母)。 |
c
类型说明符忽略填充和宽度。
尝试将字符串和宽度说明符组合使用,而字符集需要每个字符超过一个字节,可能会导致意外的结果。
变量将被强制转换为适合说明符的类型
类型 | Specifiers |
---|---|
string | s |
int |
d 、u 、c 、o 、x 、X 、b |
float |
e 、E 、f 、F 、g 、G 、h 、H |
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 is '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 ]
小心
printf ("(9.95 * 100) = %d \n", (9.95 * 100));
'994'
第一个 %d 通过截断将浮点数转换为整数。
第二个浮点数以微小的舍入误差而闻名。
[编辑注:或者直接使用 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
为了提供更友好的界面,您可以在终端中打印文本时使用颜色。
p('普通文本。');
p('警告:查看此内容...', 'info');
p('糟糕!出现错误。', 'error');
p('是的... 完成了!', 'success');
function p($text, $style = '', $newLine = true) {
$styles = array(
'success' => "\033[0;32m%s\033[0m",
'error' => "\033[31;31m%s\033[0m",
'info' => "\033[33;33m%s\033[0m",
'Black' => "\033[0;30m%s\033[0m",
'Red' => "\033[0;31m%s\033[0m",
'Green' => "\033[0;32m%s\033[0m",
'Yellow' => "\033[0;33m%s\033[0m",
'Blue' => "\033[0;34m%s\033[0m",
'Purple' => "\033[0;35m%s\033[0m",
'Cyan' => "\033[0;36m%s\033[0m",
'Gray' => "\033[0;37m%s\033[0m",
'Graphite' => "\033[1;30m%s\033[0m",
'Bold Red' => "\033[1;31m%s\033[0m",
'Bold Green' => "\033[1;32m%s\033[0m",
'Bold Yellow' => "\033[1;33m%s\033[0m",
'Bold Blue' => "\033[1;34m%s\033[0m",
'Bold Purple' => "\033[1;35m%s\033[0m",
'Bold Cyan' => "\033[1;36m%s\033[0m",
'Bold White' => "\033[1;37m%s\033[0m",
'Bg Black' => "\033[40;1;37m%s\033[0m",
'Bg Red' => "\033[41;1;37m%s\033[0m",
'Bg Green' => "\033[42;1;37m%s\033[0m",
'Bg Yellow' => "\033[43;1;37m%s\033[0m",
'Bg Blue' => "\033[44;1;37m%s\033[0m",
'Bg Purple' => "\033[45;1;37m%s\033[0m",
'Bg Cyan' => "\033[46;1;37m%s\033[0m",
'Bg Gray' => "\033[47;1;37m%s\033[0m",
'Underscore' => "\033[4;37m%s\033[0m",
'Inverted' => "\033[7;37m%s\033[0m",
'Blink' => "\033[5;37m%s\033[0m",
);
$format = '%s';
if (isset($styles[$style])) {
$format = $styles[$style];
}
if ($newLine) {
$format .= PHP_EOL;
}
printf($format, $text);
}
您可以使用此函数来格式化数字中的小数位数
$num = 2.12;
printf("%.1f",$num);
打印
2.1
另请参阅:number_format()
与其编写一个函数来准确地四舍五入浮点数(我们称之为 'x'),不如给 x 添加一个很小的数字,然后截断它...
例如:如果您想四舍五入到最接近的整数,只需给 x 添加 0.5,然后截断它。如果 x=12.6,则它将计算 13.1,并截断为 13。如果 x=14.4,则它将计算 14.9,并截断为 14。
要将美元值格式化为 $123.00,否则可能会显示为 $123,请使用以下方法
print ('$'); // 美元符号在答案前面
printf ('%.2f',$price);
确保在执行 printf() 之前,输出通道可用以写入!来自各种来源(在我的例子中,是 PHPLIB 中的 DB_Sql::query())的类中的某些函数假设即使在默认输出流关闭后,打印也能正常工作。
对我来说,这个问题在 PHP4 会话管理中最为突出,当时我创建了自己的 sess_write() 处理程序。由于我找不到任何检查 printf() 使用的输出流的函数,我不得不放弃对 printf() 的疯狂使用。(是否存在检查输出流是否存在的功能?)
如果有人想使用 printf() 写一个quine,
这是我的例子
<?php $f='<?php $f=%c%s%c; printf($f,39,$f,39); ?>'; printf($f,39,$f,39); ?>
这也有助于那些刚接触 printf() 的人了解使用 "混合参数" 的一种方式,而不仅仅是在大多数示例中看到的单个参数。
如果你缺少像 "-"*100 这样的功能来打印单个字符多次,你可以使用稍微长一点,可读性较差的 PHP 等价物 printf("%'-100s",""); 和 sprint("%'-100s","").
小心使用整数,它们不能保存很大的值。
printf("%d",10023123553.45634663);
将打印出:1433188961
而
printf("%.0f",10023123553.45634663);
将打印出:10023123553
从 msdn 复制粘贴
格式说明由可选和必填字段组成,其形式如下
%[flags] [width] [.precision] [{h | l | I64 | L}]type
格式说明的每个字段都是一个单个字符或一个表示特定格式选项的数字。最简单的格式说明只包含百分号和类型字符(例如,%s)。如果百分号后面是没有任何格式字段含义的字符,则该字符将被复制到 stdout。例如,要打印一个百分号字符,请使用 %%。
可选字段出现在类型字符之前,控制格式的其他方面,如下所示
type
确定关联参数是否被解释为字符、字符串或数字的必需字符(请参见 printf 类型字段字符表)。
flags
控制输出对齐和打印符号、空格、小数点以及八进制和十六进制前缀的可选字符或字符(请参见标志字符表)。一个格式说明中可以出现多个标志。
width
指定输出字符的最小数量的可选数字(请参见 printf 宽度说明)。
precision
指定输出字段所有或部分打印的字符的最大数量,或整数打印的最小位数的可选数字(请参见精度值如何影响类型表)。
h | l | I64 | L
用于类型的可选前缀,指定参数的大小(请参见 printf 和 wprintf 格式类型说明符的大小前缀表)。
为什么舍入与 round() 不一样?
试试这段代码
<?php
printf("%.02lf\n", 1.035);
printf("%.02lf\n", round(1.035, 2));
?>
结果
1.03
1.04
在我看来它应该是
1.04
1.04
为什么会出现这种情况?
我不知道这对其他人是否有用,但请看!使用 printf 函数输出对象的示例。
class person
{
var $name = "";
function name($newname = NULL)
{
if(! is_null($newname))
{
$this->name=$newname;
}
return $this->name;
}
var $surname = "";
function surname($newsurname = NULL)
{
if(! is_null($newsurname))
{
$this->surname=$newsurname;
}
return $this->surname;
}
var $age = "";
function age($newage = NULL)
{
if(! is_null($newage))
{
$this->age=$newage;
}
return $this->age;
}
}
$bob = new person;
$bob->name('Bob');
$bob->surname('Builder');
$bob->age('50');
printf("Hi %s, your surname is %s and you are %s years old", $bob->name, $bob->surname, $bob->age);
输出
Hi Bob, your surname is Builder and you are 50 years old
//如果你想创建很多隐藏字段,可以使用这个函数
//你可以将值作为数组值传递,这将有助于你在发布很多隐藏字段时:-
function MakeHidden($ArrValues)
{
global $dearvar;
echo $dearvar;
if(is_array($ArrValues)){
foreach($ArrValues as $key=>$values)
{
echo $MakeHTML = "<input type='hidden' name='$values' value='$values'>";
}
}
else {
echo $MakeHTML = "<input type='hidden' name='$ArrValues' value='$ArrValues'>";
}
return $MakeHTML;
}
//例如:-
MakeHidden(array("value1","value2","value3"));
//输出:-
<input type="hidden" value="value1" name="value1"/>
<input type="hidden" value="value2" name="value2"/>
<input type="hidden" value="value3" name="value3"/>
很多人已经评论了关于对齐数字的问题。我只是想澄清一下。
根据规范,所有 True Type 字体(尤其是等比例字体)都使用固定宽度来表示数字。所有数字的宽度都相同,等于 "0" 的宽度。
使用等比例字体时,尝试对齐数字时会出现问题,因为空格字符的宽度与数字的宽度不同。
因此,如果你想对齐一列数字,你就不能使用前导空格来定位它们,除非你每行使用相同数量的空格字符。例如,你的数字具有前导零等。
最简单的解决方案是切换到等宽字体。或者,你可以使用定位标签。
总结:如果你使起始位置一致,你的数字无论使用哪种字体都会始终正确对齐。
回复 chris dot breen at accurate dot com
这可以工作,但我没有尝试
<?php
$format = 'The %2$s contains %1$d monkeys.
That is a nice %2$s full of %1$d monkeys.';
printf($format, $num, $location);
?>
你的问题来自于字符串 "\$s" 中,$ 只是被 \ 转义,但对于单引号字符串,你不能这样做。尝试 echo 你的字符串以测试它,或者直接访问 https://php.net/manual/en/language.types.string.php