上次講到[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_math_number_format_ex函數。函數主要做的是:
處理負數; 根據要保留的小數點對浮點數進行四舍五入; 調用strpprintf函數将浮點數表達式轉成字元串表示; 計算需要配置設定給結果變量的字元串長度; 将結果拷貝到傳回值中(如果有千位符,則進行千位符分割)
這個函數是實作浮點數與字元串的轉換,如上文所說,最終是調用了php_conv_fp函數做的轉換(這裡是通過gdb調試做的定位),而php_conv_fp函數,往下追蹤,調用的是zend_dtoa函數,
更多細節注解,見github項目送出記錄。
閱讀完這個函數的源碼,學習到的是浮動數與字元串的互相轉換的實作細節,字元串與浮點數之間的關系較複雜,之後還要繼續學習。
原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。
更多精彩内容,請關注個人公衆号。