sprintf("%f", $num) 默認保留小數點後 6 位。
sprintf("%f", 3.1415926); // "3.141593" (四捨五入)
m — 總寬度(含小數點、符號),不足左側填充空格。n — 小數點後位數。sprintf("%9.3f", 3.1415926); // " 3.142" (右對齊,寬度 9)
sprintf("%-9.3f", 3.1415926); // "3.142 " (左對齊)
sprintf("%.3f", 3.1415926); // "3.142" (不指定總寬度)
$num = 100;
sprintf("%.2f", $num); // 正確輸出 "100.00"
sprintf("%.2f", (double)$num); // 同樣輸出 "100.00"
原理: PHP 內部會根據格式字符串自動轉換類型,但 C 底層 printf 族函數直接讀取棧內存,若格式與實際參數類型不匹配會導致未定義行為。PHP 封裝層做了類型轉換,故通常安全,但嚴禁在 sprintf 中混用不匹配的類型(如 %d 對應浮點數)。
| 格式符 | 說明 | 示例 |
|---|---|---|
%e/%E | 科學計數法 | sprintf("%.2e", 1234) → 1.23e+3 |
%g/%G | 自動選擇 %f 或 %e 更短者 | sprintf("%.3g", 0.00123) → 0.00123 |
%s | 字符串 | sprintf("Hello %s", "World") |
%d | 有符號十進制整數 | sprintf("%05d", 42) → 00042 |
%x/%X | 十六進制小寫/大寫 | sprintf("%X", 255) → FF |
number_format() 或 Money 庫,避免浮點精度問題。%m.nf 對齊。vsprintf() 處理數組參數,代碼更整潔。