PHP Conference Japan 2024

printf

(PHP 4, PHP 5, PHP 7, PHP 8)

printf輸出格式化字串

說明

printf(字串 $format, 混合 ...$values): 整數

根據 format 產生輸出。

參數

format

格式字串由零個或多個指示詞組成:直接複製到結果的普通字元(不包括 %)和*轉換規範*,每個轉換規範都會擷取其自身的參數。

轉換規範遵循以下原型:%[argnum$][flags][width][.precision]specifier

Argnum

一個整數後接一個錢字號 $,用於指定要轉換的數字參數。

標記
標記 說明
- 在給定的欄位寬度內靠左對齊;預設為靠右對齊。
+ 在正數前面加上一個加號 +;預設情況下,只有負數前面會加上負號。
(空格) 使用空格填充結果。這是預設行為。
0 僅使用零填充數字的左側。對於 s 指定符,也可以使用零填充右側。
'(字元) 使用字元 (char) 填充結果。

寬度

一個整數,表示此轉換應產生的最小字元數,或者使用 *。如果使用 *,則寬度作為一個額外的整數值提供,位於由指定符格式化的整數值之前。

精度

一個句點 .,後面可選地接一個整數或 *,其含義取決於指定符。

  • 對於 eEfF 指定符:這是要打印在小數點後的位數(預設為 6)。
  • 對於 gGhH 指定符:這是要打印的最大有效數字位數。
  • 對於 s 指定符:它充當一個截斷點,設定字串的最大字元限制。

注意如果指定了句點但沒有明確的精度值,則假設為 0。如果使用 *,則精度作為一個額外的整數值提供,位於由指定符格式化的整數值之前。

指定符
指定符 說明
% 一個字面百分比字元。不需要參數。
b 參數被視為整數,並以二進位數表示。
c 參數被視為整數,並以該 ASCII 字元表示。
d 參數被視為整數,並以(帶符號的)十進位數表示。
e 參數被視為科學記數法(例如 1.2e+2)。
E e 指定符類似,但使用大寫字母(例如 1.2E+2)。
f 參數被視為浮點數,並以浮點數表示(考慮地區設定)。
F 參數被視為浮點數,並以浮點數表示(不考慮地區設定)。
g

通用格式。

設 P 等於精度(若非零),若省略精度則為 6,若精度為零則為 1。然後,如果使用樣式 E 的轉換的指數為 X

如果 P > X ≥ −4,則使用樣式 f 和精度 P − (X + 1) 進行轉換。否則,使用樣式 e 和精度 P − 1 進行轉換。

G g 指定符類似,但使用 Ef
h g 指定符類似,但使用 F。從 PHP 8.0.0 開始可用。
H g 指定符類似,但使用 EF。從 PHP 8.0.0 開始可用。
o 參數被視為整數,並以八進位數表示。
s 參數被視為字串並以字串表示。
u 參數被視為整數,並以無符號十進位數表示。
x 參數被視為整數,並以十六進位數表示(使用小寫字母)。
X 參數被視為整數,並以十六進位數表示(使用大寫字母)。

警告

類型指定符 c 會忽略填補和寬度。

警告

嘗試將字串和寬度指定符與每個字元需要一個以上位元組的字元集組合使用可能會導致意外結果。

變數將會被強制轉換為指定符的合適類型。

類型處理
類型 指定符
字串 s
整數 ducoxXb
浮點數 eEfFgGhH

返回值

返回輸出字串的長度。

錯誤/例外

從 PHP 8.0.0 開始,如果引數數量為零,則會拋出 ValueError。在 PHP 8.0.0 之前,則會發出 E_WARNING

從 PHP 8.0.0 開始,如果 [width] 小於零或大於 PHP_INT_MAX,則會拋出 ValueError。在 PHP 8.0.0 之前,則會發出 E_WARNING

從 PHP 8.0.0 開始,如果 [precision] 小於零或大於 PHP_INT_MAX,則會拋出 ValueError。在 PHP 8.0.0 之前,則會發出 E_WARNING

從 PHP 8.0.0 開始,當提供的引數少於所需引數時,會拋出 ArgumentCountError。在 PHP 8.0.0 之前,會返回 false 並發出 E_WARNING

更新日誌

版本 說明
8.0.0 此函式在失敗時不再返回 false
8.0.0 如果引數數量為零,則拋出 ValueError;先前此函式會發出 E_WARNING
8.0.0 如果 [width] 小於零或大於 PHP_INT_MAX,則拋出 ValueError;先前此函式會發出 E_WARNING
8.0.0 如果 [precision] 小於零或大於 PHP_INT_MAX,則拋出 ValueError;先前此函式會發出 E_WARNING
8.0.0 當提供的引數少於所需引數時,拋出 ArgumentCountError;先前此函式會發出 E_WARNING

範例

範例 #1 printf():各種範例

<?php
$n
= 43951789;
$u = -43951789;
$c = 65; // ASCII 65 等於 'A'

// 注意兩個 %%,這會印出一個 '%' 字元
printf("%%b = '%b'\n", $n); // 二進位表示法
printf("%%c = '%c'\n", $c); // 印出 ASCII 字元,與 chr() 函式相同
printf("%%d = '%d'\n", $n); // 標準整數表示法
printf("%%e = '%e'\n", $n); // 科學記號表示法
printf("%%u = '%u'\n", $n); // 正整數的無號整數表示法
printf("%%u = '%u'\n", $u); // 負整數的無號整數表示法
printf("%%f = '%f'\n", $n); // 浮點數表示法
printf("%%o = '%o'\n", $n); // 八進位表示法
printf("%%s = '%s'\n", $n); // 字串表示法
printf("%%x = '%x'\n", $n); // 十六進位表示法(小寫)
printf("%%X = '%X'\n", $n); // 十六進位表示法(大寫)

printf("%%+d = '%+d'\n", $n); // 正整數的符號指定器
printf("%%+d = '%+d'\n", $u); // 負整數的符號指定器
?>

以上範例將輸出:

%b = '10100111101010011010101101'
%c = 'A'
%d = '43951789'
%e = '4.39518e+7'
%u = '43951789'
%u = '4251015507'
%f = '43951789.000000'
%o = '247523255'
%s = '43951789'
%x = '29ea6ad'
%X = '29EA6AD'
%+d = '+43951789'
%+d = '-43951789'

範例 #2 printf():字串指定器

<?php
$s
= 'monkey';
$t = 'many monkeys';

printf("[%s]\n", $s); // 標準字串輸出
printf("[%10s]\n", $s); // 使用空格靠右對齊
printf("[%-10s]\n", $s); // 使用空格靠左對齊
printf("[%010s]\n", $s); // 字串也能使用零填充
printf("[%'#10s]\n", $s); // 使用自訂填充字元 '#'
printf("[%'#*s]\n", 10, $s); // 將填充寬度作為額外參數提供
printf("[%10.9s]\n", $t); // 靠右對齊,但截斷為 9 個字元
printf("[%-10.9s]\n", $t); // 靠左對齊,但截斷為 9 個字元
?>

以上範例將輸出:

[monkey]
[    monkey]
[monkey    ]
[0000monkey]
[####monkey]
[####monkey]
[ many monk]
[many monk ]

另請參閱

新增註釋

使用者貢獻的註釋 7 則註釋

dhosek at excite dot com
25 年前
小心!
printf ("(9.95 * 100) = %d \n", (9.95 * 100));

'994'

首先,%d 會將浮點數截斷成整數。

其次,浮點數很容易出現微小的捨入誤差。
php at mole dot gnubb dot net
19 年前
[編者註:或者直接使用 vprintf...]

如果您想執行類似 <?php printf('There is a difference between %s and %s', array('good', 'evil')); ?> (這樣做無效)而不是 <?php printf('There is a difference between %s and %s', 'good', 'evil'); ?> 的操作,您可以使用以下函式:

<?php
function printf_array($format, $arr)
{
return
call_user_func_array('printf', array_merge((array)$format, $arr));
}
?>

使用方法如下:
<?php
$goodevil
= array('good', 'evil');
printf_array('There is a difference between %s and %s', $goodevil);
?>
它會印出:
There is a difference between good and evil
simon dot patrick at cantab dot net
3 個月前
關於 printf 的一些注意事項:
1. 格式指定符 g(或 G)的定義經常被錯誤地描述為「使用 e 或 f(或 E 或 F),以產生較短字串者為準」。正確的規則在文件中已說明,且並不總是產生此結果。
2. 對於 g/G/h/H,小數點後的尾隨零會被移除(但小數點後緊接的零不會被移除,如同 e/E 格式)。
3. g/G 會根據語系環境決定產生 e/E 或 f 格式。
4. 對於 b/o/x/X/u(即除 d 以外的所有整數格式),負值的顯示結果為該數字的二補數形式,即 2**32 + v,其中 v 為(負)值。
deekayen at hotmail dot com
23 年前
您可以使用此函式來格式化數字的小數位數:

$num = 2.12;
printf("%.1f",$num);

印出:

2.1

另請參閱:number_format()
maybird99 at yahoo dot com
22 年前
與其編寫一個函式來精確地四捨五入浮點數(我們稱之為 'x'),不如在 x 上加上一個小數字然後截斷它,這樣更容易...
例如:如果您想四捨五入到最接近的整數,只需將 0.5 加到 x,然後將其捨去小數部分。如果 x=12.6,則它會計算 13.1,並將其捨去小數部分變成 13。如果 x=14.4,則它會計算 14.9,並將其捨去小數部分變成 14。
Mario M. Junior
2 年前
為了提供更友善的使用者介面,您可以在終端機中列印文字時使用顏色。

p('一般文字。');
p('警告:看看這個...', 'info');
p('糟糕!發生錯誤。', 'error');
p('耶... 完成!', 'success');

function p($text, $style = '', $newLine = true) {

$styles = array(
'success' => "\033[0;32m%s\033[0m",
'error' => "\033[31;31m%s\033[0m",
'info' => "\033[33;33m%s\033[0m",

'Black' => "\033[0;30m%s\033[0m", // 黑色
'Red' => "\033[0;31m%s\033[0m", // 紅色
'Green' => "\033[0;32m%s\033[0m", // 綠色
'Yellow' => "\033[0;33m%s\033[0m", // 黃色
'Blue' => "\033[0;34m%s\033[0m", // 藍色
'Purple' => "\033[0;35m%s\033[0m", // 紫色
'Cyan' => "\033[0;36m%s\033[0m", // 青色
'Gray' => "\033[0;37m%s\033[0m", // 灰色
'Graphite' => "\033[1;30m%s\033[0m", // 深灰色

'Bold Red' => "\033[1;31m%s\033[0m", // 粗體紅色
'Bold Green' => "\033[1;32m%s\033[0m", // 粗體綠色
'Bold Yellow' => "\033[1;33m%s\033[0m", // 粗體黃色
'Bold Blue' => "\033[1;34m%s\033[0m", // 粗體藍色
'Bold Purple' => "\033[1;35m%s\033[0m", // 粗體紫色
'Bold Cyan' => "\033[1;36m%s\033[0m", // 粗體青色
'Bold White' => "\033[1;37m%s\033[0m", // 粗體白色

'Bg Black' => "\033[40;1;37m%s\033[0m", // 黑色背景
'Bg Red' => "\033[41;1;37m%s\033[0m", // 紅色背景
'Bg Green' => "\033[42;1;37m%s\033[0m", // 綠色背景
'Bg Yellow' => "\033[43;1;37m%s\033[0m", // 黃色背景
'Bg Blue' => "\033[44;1;37m%s\033[0m", // 藍色背景
'Bg Purple' => "\033[45;1;37m%s\033[0m", // 紫色背景
'Bg Cyan' => "\033[46;1;37m%s\033[0m", // 青色背景
'Bg Gray' => "\033[47;1;37m%s\033[0m", // 灰色背景

'Underscore' => "\033[4;37m%s\033[0m", // 底線
'Inverted' => "\033[7;37m%s\033[0m", // 反白
'Blink' => "\033[5;37m%s\033[0m", // 閃爍
);

$format = '%s';

if (isset($styles[$style])) {
$format = $styles[$style];
}

if ($newLine) {
$format .= PHP_EOL;
}

printf($format, $text);
}
steve at myschoolsystems dot com
3 年前
要將美元值格式化為 $123.00(否則可能看起來像 $123),請使用以下方法

print ('$'); // 在答案前面加上美元符號
printf ('%.2f',$price);
To Top