Last time I talked about how PHP parses large integers, I briefly touched on the processing of number_format, and then read the source code of this function in detail. The following is a small analysis.
string number_format ( float $number [, int $decimals = 0 ] ) string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )
The function can accept 1, 2, or 4 parameters (see the code implementation for details).
If only the first parameter is provided, the decimal part of the number will be removed, and each thousand separator is an English lowercase comma ",";
If two parameters are provided, the number will be retained The number of digits after the decimal point reaches the value you set, and the rest is the same as above;
If four parameters are provided, number will retain the decimal part of decimals length, the decimal point is replaced by dec_point, and the thousands separator is replaced by thousands_sep
// number // 你要格式化的数字 // num_decimal_places // 要保留的小数位数 // dec_separator // 指定小数点显示的字符 // thousands_separator // 指定千位分隔符显示的字符 /* {{{ proto string number_format(float number [, int num_decimal_places [, string dec_separator, string thousands_separator]]) Formats a number with grouped thousands */ PHP_FUNCTION(number_format) { // 期望number_format的第一个参数num是double类型的,在词法阶段已经对字面量常量做了转换 double num; zend_long dec = 0; char *thousand_sep = NULL, *dec_point = NULL; char thousand_sep_chr = ',', dec_point_chr = '.'; size_t thousand_sep_len = 0, dec_point_len = 0; // 解析参数 ZEND_PARSE_PARAMETERS_START(1, 4) Z_PARAM_DOUBLE(num)// 拿到double类型的num Z_PARAM_OPTIONAL Z_PARAM_LONG(dec) Z_PARAM_STRING_EX(dec_point, dec_point_len, 1, 0) Z_PARAM_STRING_EX(thousand_sep, thousand_sep_len, 1, 0) ZEND_PARSE_PARAMETERS_END(); switch(ZEND_NUM_ARGS()) { case 1: RETURN_STR(_php_math_number_format(num, 0, dec_point_chr, thousand_sep_chr)); break; case 2: RETURN_STR(_php_math_number_format(num, (int)dec, dec_point_chr, thousand_sep_chr)); break; case 4: if (dec_point == NULL) { dec_point = &dec_point_chr; dec_point_len = 1; } if (thousand_sep == NULL) { thousand_sep = &thousand_sep_chr; thousand_sep_len = 1; } // _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; } } /* }}} */
Round floating point numbers according to the decimal point to be retained;
Call the strpprintf function to convert floating point expressions into string representation;
Calculate The length of the string that needs to be assigned to the result variable;
Copy the result to the return value (if there are thousands characters, perform thousands character separation)
The above is the detailed content of PHP reads the source code sharing of number_format function. For more information, please follow other related articles on the PHP Chinese website!