上次講到php是如何解析大整數的,一筆帶過了number_format的處理,再詳細閱讀該函式的原始碼,以下是小分析。
string number_format ( float
$number [, int $decimals = 0 ] )
string number_format ( float
$number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )複製**
函式可以接受1、2、4個引數(具體可以看**的實現)。
如果只提供第乙個引數,number的小數部分會被去掉,並且每個千位分隔符都是英文小寫逗號"," ;
如果提供兩個引數,number將保留小數點後的位數到你設定的值,其餘同樓上;
如果提供了四個引數,number 將保留decimals個長度的小數部分, 小數點被替換為dec_point,千位分隔符替換為thousands_sep
// number
// 你要格式化的數字
// num_decimal_places
// 要保留的小數字數
// dec_separator
// 指定小數點顯示的字元
// thousands_separator
// 指定千位分隔符顯示的字元
/* if (thousand_sep == null)
// _php_math_number_format_ex
// 真正處理的函式,在本檔案第1107行
retval_str(_php_math_number_format_ex(num, (int)dec,
dec_point, dec_point_len, thousand_sep, thousand_sep_len));
break;
default:
wrong_param_count;
}}/* }}} */複製**
number_format流程圖
函式實現的各種引數數量,最終都會呼叫_php_math_number_format_ex函式。函式主要做的是:
處理負數;這個函式是實現浮點數與字串的轉換,如上文所說,最終是呼叫了php_conv_fp函式做的轉換(這裡是通過gdb除錯做的定位),而php_conv_fp函式,往下追蹤,呼叫的是zend_dtoa函式,根據要保留的小數點對浮點數進行四捨五入;
呼叫strpprintf函式將浮點數表示式轉成字串表示;
計算需要分配給結果變數的字串長度;
將結果拷貝到返回值中(如果有千位符,則進行千位符分割)
更多細節註解,見github專案提交記錄。
閱讀完這個函式的原始碼,學習到的是浮動數與字串的互相轉換的實現細節,字串與浮點數之間的關係較複雜,之後還要繼續學習。
原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。
PHP原始碼閱讀 number format函式
上次講到php是如何解析大整數的,一筆帶過了number format的處理,再詳細閱讀該函式的原始碼,以下是小分析。string number format float number int decimals 0 string number format float number int deci...
《原始碼閱讀》原始碼閱讀技巧,原始碼閱讀工具
檢視某個類的完整繼承關係 選中類的名稱,然後按f4 quick type hierarchy quick type hierarchy可以顯示出類的繼承結構,包括它的父類和子類 supertype hierarchy supertype hierarchy可以顯示出類的繼承和實現結構,包括它的父類和...
PHP原始碼閱讀 count函式
在php程式設計中,在遍歷陣列的時候經常需要先計算陣列的長度作為迴圈結束的判斷條件,而在php裡面對陣列的操作是很頻繁的,因此count也算是乙個常用函式,下面研究一下count函式的具體實現。我在github上有對php原始碼更詳細的註解。感興趣的可以圍觀一下,給個star。php5.4原始碼註解...