天天看點

[PHP源碼閱讀]number_format函數

上次講到[PHP是如何解析大整數](http://www.hoohack.me/2017/09/14/learning-php-big-number-detail)的,一筆帶過了number_format的處理,再詳細閱讀該函數的源碼,以下是小分析。

上次講到PHP是如何解析大整數的,一筆帶過了number_format的處理,再詳細閱讀該函數的源碼,以下是小分析。

函數可以接受1、2、4個參數(具體可以看代碼的實作)。

如果隻提供第一個參數,number的小數部分會被去掉,并且每個千位分隔符都是英文小寫逗号"," ;

如果提供兩個參數,number将保留小數點後的位數到你設定的值,其餘同樓上;

如果提供了四個參數,number 将保留decimals個長度的小數部分, 小數點被替換為dec_point,千位分隔符替換為thousands_sep

[PHP源碼閱讀]number_format函數

函數實作的各種參數數量,最終都會調用_php_math_number_format_ex函數。函數主要做的是:

處理負數; 根據要保留的小數點對浮點數進行四舍五入; 調用strpprintf函數将浮點數表達式轉成字元串表示; 計算需要配置設定給結果變量的字元串長度; 将結果拷貝到傳回值中(如果有千位符,則進行千位符分割)

這個函數是實作浮點數與字元串的轉換,如上文所說,最終是調用了php_conv_fp函數做的轉換(這裡是通過gdb調試做的定位),而php_conv_fp函數,往下追蹤,調用的是zend_dtoa函數,

更多細節注解,見github項目送出記錄。

閱讀完這個函數的源碼,學習到的是浮動數與字元串的互相轉換的實作細節,字元串與浮點數之間的關系較複雜,之後還要繼續學習。

原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。

更多精彩内容,請關注個人公衆号。