1. 程式人生 > >php 中的sprintf 坑

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是可選,也就是可以不格式化這麼多