php 中的sprintf 坑

先说下为什么要写这个函数的前言,这个是我在看工作中发现一处四舍五入的bug后,当时非常不理解,

echo sprintf('%.2f',123.455); //123.45
echo sprintf('%.2f',12.455);//12.46

语法: int sprintf(string format, mixed [args]…);

类型参照表,也就是要转换成什么类型的格式

%d 十进制有符号整数
%u 十进制无符号整数
%f 浮点数
%s 字符串
%c 单个字符
%p 指针的值
%e 指数形式的浮点数
%x, %X 无符号以十六进制表示的整数
%o 无符号以八进制表示的整数
%g 自动选择合适的表示法
%-06.2f 的解释:
  1. 处理字符方向。-负号时表时从后向前处理(向左对齐)。
  2. 填空字元。 0 的话表示空格填 0;空格是内定值,表示空格就放着。
  3. 字符总宽度。为最小宽度。[小数点算1位]
  4. 精确度。指在小数点后的浮点数位数。


注意:如果字符串的长度、或整型数位数超过说明的场宽, 将按其实际长度输出。 
如:
$money = 1.4;
$formatted = sprintf ("%-01.2f", $money);
echo $formatted;//1.40

例子:
       $money = 123.1;
  $formatted = sprintf ("%06.2f", $money); // 此时变数 $ formatted 值为 "123.10"
  $formatted = sprintf ("%08.2f", $money); // 此时变数 $ formatted 值为 "00123.10"
  $formatted = sprintf ("%-08.2f", $money); // 此时变数 $ formatted 值为 "123.1000"
  $formatted = sprintf ("%.2f%%", 0.95 * 100); // 格式化为百分比

    %06.2f 解释:
  %开始符
  0是 “填空字元” 表示,如果长度不足时就用0来填满。
  6格式化后总长度
  2f小数位长度,即2位
  ¢第4行值为”00123.10″ 解释:
  因为2f是(2位)+小数点符号(1)+前面123(3位)=6位,总长度为8位,故前面用[填空字元]0表示,即00123.10
  ¢第4行值为”-123.1000″ 解释:
  -号为反向操作,然后填空字元0添加在最后面了  

2. 一些特殊规定字符

b 字符 作用

\n 换行
\f 清屏并换页
\r 回车
\t Tab符
\xhh 表示一个ASCII码用16进表示,
其中hh是1到2个16进制数


那么多个值怎么格式化一起呢

$a="abcdef";
$c="1234";
echo sprintf("%1\$s%2\$s",$c,$a);
//输出为: 1234abcdef
%s为一个标记,两个%s%s这样写却是错误的,每个%s必须标记键位,不然我怎么知道都代表格式化后面的哪个$str呢,所以有个特别的语法%1\$%2\$      
 
解释:%1表示格式化sprintf("%1\$%2\$",''$str1","$str2")中对应的$str1,那么%2自然表示格式化$str2,\$是代表有多个值准备格式化,所以每个%1和%2或者还有%3的标记后都要加这个符号代表一行中有多个标记,如果只有一个标记就不用\$了占位符了,记住$str2、$str3是可选,也就是可以不格式化这么多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值