一、简介
用来格式化输出的,比如:四舍五入输出,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