php sprintf()函数

305 阅读2分钟

一、简介

用来格式化输出的,比如:四舍五入输出,XML格式的数据等

二、参考示例

以%s %f %d进行举例,其他的请参考以下附录

  • %% - 返回一个百分号 %
  • %b - 二进制数
  • %c - ASCII 值对应的字符
  • %d - 包含正负号的十进制数(负数、0、正数)
  • %e - 使用小写的科学计数法(例如 1.2e+2)
  • %E - 使用大写的科学计数法(例如 1.2E+2)
  • %u - 不包含正负号的十进制数(大于等于 0)
  • %f - 浮点数(本地设置)
  • %F - 浮点数(非本地设置)
  • %g - 较短的 %e 和 %f
  • %G - 较短的 %E 和 %f
  • %o - 八进制数
  • %s - 字符串
  • %x - 十六进制数(小写字母)
  • %X - 十六进制数(大写字母)

三、使用示例

1、单个参数

$string = 'abcd';

$result = sprintf("hello <%s>", $string); // 此处注意:一定要使用双引号(")包裹,否则会解析不出来
dump($result); // string(12) "hello <abcd>"

2、占位符,两个及以上参数使用,格式为%1\$s,需要在%与s之间,添加1\$2\$

$age = 18;
$name = '小明';

$result = sprintf("我是%1\$s,我今年%2\$s岁了。", $name, $age);
dump($result);// string(33) "我是小明,我今年18岁了。"

$result = sprintf("我是%2\$s,我今年%1\$s岁了。", $name, $age);
dump($result);// string(33) "我是18,我今年小明岁了。"

3、补位,格式为%'x10s,需要在%与s之间添加 补位 和 宽度,'x 指以x补位,10指宽度

$num = 'abcd';
// 有补位符,有宽度
$result = sprintf("%'x10s", $num);
dump($result);// string(10) "xxxxxxabcd"

// 有补位符,没宽度,原样输出传入字符串
$result = sprintf("%'xs", $num);
dump($result);// string(4) "abcd"

// 没补位符,有宽度
$result = sprintf("%10s", $num);
dump($result);// string(10) "      abcd"

// 没补位符,没宽度,原样输出传入字符串
$result = sprintf("%s", $num);
dump($result);// string(4) "abcd"

// 有补位符,有宽度,但宽度小于传入字符串的长度,原样输出传入字符串
$result = sprintf("%'x1s", $num);
dump($result);// string(4) "abcd"

// 无补位符,有宽度,但宽度小于传入字符串的长度,原样输出传入字符串
$result = sprintf("%1s", $num);
dump($result);// string(4) "abcd"

4、多参数+补位

$name = '小明';
$age = 8;
$number = '1';

$result = sprintf("我是%1\$s,我今年%2\$'02d岁了,我的序号是%3$'05d。", $name, $age,$number);
dump($result);// string(54) "我是小明,我今年08岁了,我的序号是00001。"

5、补位方向,默认向左补位,格式为 %-9s ,- 方向符号(向右补位),9 宽度值

$string = 'abcdef';

$result = sprintf("%-9s", $string);
dump($result);// string(9) "abcdef   "

$result = sprintf("%9s", $string);
dump($result);// string(9) "   abcdef"

6、注意事项

// 尽量往你想要的方向上转,5.266a并不是浮点数,但是会转成浮点数,且四舍五入
$num = '5.266a';
$result = sprintf("%'x13.2f", $num);
dump($result);// string(13) "xxxxxxxxx5.27"

$num = '5.266a';
$result = sprintf("%'03d", $num);
dump($result);// string(3) "005"

// 宽度值小于传入的字符串
$num = "10002";
$result = sprintf("%'03d", $num);
dump($result);// string(5) "10002"

// 宽度值小于传入的字符串 比较奇怪,为啥这个地方不是原样输出了?往下看总结
$num = "00002";
$result = sprintf("%'03d", $num);
dump($result);// string(3) "002"

7、总结,例子:sprintf("%1\$'x3d",'000002','abcdefg')

  • format为 % 1\$ 'x 3 d
  • 1-> 先找到%....d,知道你是想要转换的情况,是不是想转换
  • 2-> 从左边开始找有没有多参数的情况 1\$,匹配多参数
  • 3-> 从右边找d,知道你想要转换的类型,是转成字符串、数字、浮点数?
  • 4-> 知道你要转的类型之后,把对应的参数先转换一下,比如00002转成2
  • 5-> 继续从左边找,看有没有 'x 补位符
  • 6-> 继续从左边找,看有没有 3 宽度值
  • 7-> 把2转成 xx2