上次讲到[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项目提交记录。
阅读完这个函数的源码,学习到的是浮动数与字符串的互相转换的实现细节,字符串与浮点数之间的关系较复杂,之后还要继续学习。
原创文章,文笔有限,才疏学浅,文中若有不正之处,万望告知。
更多精彩内容,请关注个人公众号。