php 中的sprintf 坑
阿新 • • 發佈:2018-12-29
先說下為什麼要寫這個函式的前言,這個是我在看工作中發現一處四捨五入的bug後,當時非常不理解,
echo sprintf('%.2f',123.455); //123.45
echo sprintf('%.2f',12.455);//12.46
語法: int sprintf(string format, mixed [args]…);型別參照表,也就是要轉換成什麼型別的格式
%-06.2f 的解釋: 1. 處理字元方向。-負號時表時從後向前處理(向左對齊)。 2. 填空字元。 0 的話表示空格填 0;空格是內定值,表示空格就放著。 3. 字元總寬度。為最小寬度。[小數點算1位] 4. 精確度。指在小數點後的浮點數位數。%d 十進位制有符號整數 %u 十進位制無符號整數 %f 浮點數 %s 字串 %c 單個字元 %p 指標的值 %e 指數形式的浮點數 %x, %X 無符號以十六進位制表示的整數 %o 無符號以八進位制表示的整數 %g 自動選擇合適的表示法
注意:如果字串的長度、或整型數位數超過說明的場寬, 將按其實際長度輸出。
如:
$money = 1.4;
$formatted = sprintf ("%-01.2f", $money);
echo $formatted;//1.40
例子: $money = 123.1; $formatted = sprintf ("%06.2f", $money); // 此時變數 $ formatted 值為 "123.10"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是可選,也就是可以不格式化這麼多