php中的sprintf()函式的format格式字串
上次碰到的ASCII碼問題,檢視別人部落格時,發現使用sprintf(),可以來輸出。這個輸出函式,以前也看了好多次,然而並未仔細看它的用途。這次就徹底檢視手冊,整明白,到底可以做什麼。就有了如下的文件翻譯,因中文文件該函式文件也是英文,只能是自己有限的翻譯下:
format字串由0個或更多的指令組成:普通字元(除了%)不會轉變,直接複製到結果字串中;轉換說明(conversion specifications),每個都會獲取自己的引數,並替換到結果字串中。
應用在sprintf()和printf()中。
每個轉換說明由一個%,%後,按順序跟著一個或多個下面的元素:
1.一個可選的標誌說明符,用於數字,表示正負(- | +)。在php4.3.0新增上。
2.一個可選的標誌說明符,設定用於填充到結果字串右邊的字元,以達到結果字串的長度。可能是空格或0.預設以空格填充。可以指定一個可選的填充字元,以 "'"(單引號) 作為字首。
3.一個可選的標誌說明符,設定結果應該是左對齊還是右對齊。預設是右對齊,設定 '-' ,將變為左對齊。
4.一個可選的數字說明符,設定轉換後的字元長度(最小長度)。
5.一個可選的精度說明符,格式是:小數點+可選的十進位制數字(.3),表示應該顯示幾個小數位數。
1>當在一個字串中使用了這個指定符,它扮演的就像一個”分界符“(a cutoff point),設定限制顯示字串的最大長度。(例如:sprintf('%.4s', 'dongxuemin'),將輸出:dong)
2>Additionally, the character to use when padding a number may optionally be specified between the period and the digit. -- 實在是翻譯的不對勁啊(另外,當填充一個數字時,在小數點和數字中間,可以選擇性的指定一個填充字元。測試不正確。。不懂這句話的意思)
6.一個型別說明符,告訴引數資料應該被當作什麼型別。可能的型別如下:
% - 字面的%,不需要任何引數。(結果想輸出%,就得是%%)
b - 引數被當作整型,代表一個二進位制數字
c - 引數被當作整型,代表一個ASCII碼
d - 引數被當作整型,代表一個十進位制數字
e - 引數被當作一個科學計數(例如:1.2e+2),精度說明符代表小數點後數字的個數(PHP5.2.1新增),更早的版本中,它被作為有效位數的個數。
E - 同%e一樣,只是使用的大寫字母(例如:1.2E+2)
f - 引數被當作浮點型,代表一個符點數(浮點格式輸出)
F - 引數被當作浮點型,代表一個符點數(非符點格式輸出)
g - %e和%f的簡寫
G - %E和%f的簡寫
o - 引數被當作整型,代表一個八進位制數字
s - 引數被當作字元型,代表一個字串
u - 引數被當作整型,代表一個無符號的十進位制數字
x - 引數被當作整型,代表一個十六進位制數字(小寫字母)
X - 引數被當作整型,代表一個十六進位制數字(大寫字母)
說明符的變數,會被強迫歸結為一個合適的型別:
Type | Specifiers |
---|---|
string | s |
integer | d, u, c, o, x, X, b |
double | g, G, e, E, f, F |
嘗試結合使用字串說明符和寬度說明符,每個字元將需要多於一個位元組的儲存空間,這可能不是我們希望的結果(自己按需使用)
格式字串支援引數編號/引數交換
手冊上的幾個例項:
1.引數交換
$num = 5; $location = 'tree'; $format = 'There are %d monkeys in the %s'; echo sprintf($format, $num, $location); // %d-$num & %s-$location 替換,輸出:'There are monkeys in the tree'
2.假設:我們在一個單獨的檔案中,來專門儲存格式字串。因為通常的程式會有國際化這一架構,會將程式中有關提醒、輸出的字串定義為 “格式化字串”,寫在單獨的檔案中或目錄(一般是locale),再根據不同的語言來進行替換輸出。
現在有一個問題。格式化字串中佔位符的順序,和程式碼中引數的順序不匹配。
$format = 'The %s contains %d monkeys'; // 第一個是%s,第二個是%d
<span style="font-family: Arial, Helvetica, sans-serif;">echo sprintf($format, $num, $location); // 引數的一個是num,第二個是字串。和上面的順序不匹配</span>
// 我們肯定不會修改程式碼中引數的位置,而是簡單的指出格式化字串中,佔位符應該使用哪個引數。所以,格式化字串應該像下面一樣修改:
$format = 'The %2$s contains %1$d monkeys'; // 可以使用這種方式,指定使用%s使用第二個引數,%d使用第一個引數
echo sprintf($format, $num, $location); // 函式呼叫引數順序不變(函式可能在很多地方呼叫)
3.上面的使用方式,有一個額外的好處:我們不用在函式呼叫中,新增額外的引數,就可以重複使用佔位符,例如:
$format = 'The %2$s contains %1$d monkeys.That\'s a nice %2$s full of %1$d monkeys.'; // 同樣的佔位符,使用了多次 echo sprintf($format, $num, $location); // 函式呼叫並未新增額外的引數
4.當使用引數轉換,“n$” 位置說明符必需緊隨 “%” 後,在其他說明符前面
5.指定 “填充字元”,就像我們前面說的,以單引號(')作為字首
echo sprintf("%'.9d\n", 123); // 輸出:......123 echo sprintf("%'.09d\n", 123); // 輸出:000000123 ------- 以(')開頭,以為填充的是.,但並不是,而是.後的字元0。測試了下:sprintf("%'. 9d\n", 123),也會以 ' '(空格)填充。其他字元則不會。 // 此外,再測試了下,空格&0的填充: echo sprintf("%09d\n", 123); // 以0填充,不需要'(單引號) echo sprintf("% 9d\n", 123); // 以空格填充,不需要'(單引號)
分析:0和空格,比較特殊,記住這幾種方式都可以填充。其他字元還是老老實實使用標準的 'x 進行填充.
6.位置說明符與其他說明符一起使用:
$format = 'The %2$s contains %1$04d monkeys'; echo sprintf($format, $num, $location); // 輸出:The tree contains 0005 monkeys
注意:
嘗試使用 “位置說明符” > PHP_INT_MAX,將會產生一個warning的錯誤!顯示:“Warning The c type specifier ignores padding and width”。不過,我們肯定不會這麼寫錯的。。