Home  >  Article  >  Backend Development  >  PHP reads the source code sharing of number_format function

PHP reads the source code sharing of number_format function

黄舟
黄舟Original
2017-09-22 09:11:552055browse

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.

Function prototype

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

PHP_FUNCTION(number_format)

// 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;
    }
}
/* }}} */

Code execution flow chart

PHP reads the source code sharing of number_format function

##_php_math_number_format_ex

Function The number of various parameters implemented will eventually call the _php_math_number_format_ex function. What the function mainly does is:

Process negative numbers;

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)

strpprintf

This function is To realize the conversion of floating point numbers and strings, as mentioned above, the conversion is ultimately done by calling the php_conv_fp function (here is the positioning done through gdb debugging), and the php_conv_fp function, tracing down, calls the zend_dtoa function,

For more detailed notes, see the github project submission record.

Summary

After reading the source code of this function, what I learned is the implementation details of the mutual conversion of floating numbers and strings. The relationship between strings and floating point numbers is more complicated. To continue learning.

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!

Statement:
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn