sprintf 與 printf 皆用於格式化字串,核心差異在於「回傳」與「直接輸出」。本文詳細比較兩者語法、格式化代碼、常見用法與效能考量。
| 特性 | sprintf | printf |
|---|---|---|
| 回傳值 | 格式化後的字串 | 輸出字串的長度 |
| 輸出方式 | 不輸出,需自行 echo | 直接輸出到標準輸出 |
| 適用場景 | 字串組合、存入變數、日誌、SQL 組裝 | 直接顯示、CLI 輸出、簡單除錯 |
% - 百分號字面值
b - 二進位整數
c - ASCII 字元
d - 有號十進位整數
e - 科學記號 (小寫)
E - 科學記號 (大寫)
f - 浮點數 (預設 6 位小數)
F - 不區域化的浮點數
g - 依精度自動選擇 %e 或 %f
G - 依精度自動選擇 %E 或 %F
o - 八進位整數
s - 字串
u - 無號十進位整數
x - 十六進位 (小寫)
X - 十六進位 (大寫)
%0.2f // 保留 2 位小數,不足補 0
%9.3f // 總寬 9 含小數點,右對齊,空格補齊
%-9.3f // 左對齊
%'.-9.3f // 自訂填補字元 (單引號後為填補字元)
%+d // 強制顯示正負號
% d // 正數前加空格,負數顯示負號
%05d // 整數不足 5 位前補 0
<?php
$num1 = 21;
$num2 = 16.3287;
$num3 = 32.12329;
echo sprintf("%0.2f
", $num1); // 21.00
echo sprintf("%0.2f
", $num2); // 16.33 (四捨五入)
echo sprintf("%0.2f
", $num3); // 32.12
// printf 直接輸出
printf("姓名: %s, 年齡: %d, 身高: %.1f cm
", "小明", 25, 172.5);
// 輸出: 姓名: 小明, 年齡: 25, 身高: 172.5 cm
// 字串填補
printf("[%-10s] [%05d] [%.2f]
", "A", 7, 3.14159);
// [A ] [00007] [3.14]
// 取得格式化字串存入變數
$log = sprintf("[%s] %s: %s", date('Y-m-d H:i:s'), 'INFO', 'User login');
file_put_contents('app.log', $log . PHP_EOL, FILE_APPEND);
$num = 100;
var_dump(sprintf("%.2f", $num)); // string(6) "100.00" 正常 (PHP 自動轉型)
var_dump(sprintf("%.2f", (double)$num)); // 相同
// 注意:在 C 語言中會導致未定義行為,PHP 內部已處理型別轉換,安全。
"Hello $name" 效能優於 sprintf。vsprintf + 陣列參數,減少函式呼叫開銷。print 非格式化函式,僅接受單一字串參數,永遠回傳 1,優先級低於 echo,較少用於現代開發。
掌握 sprintf/printf 格式化語法,能寫出更易讀、可維護的字串組合邏輯,尤其在國際化、日誌、報表產出場景不可或缺。