La dernière fois, j'ai parlé de la façon dont PHP analyse les grands entiers. J'ai brièvement abordé le traitement de number_format. Ensuite, j'ai lu le code source de cette fonction en détail.
string number_format ( float $number [, int $decimals = 0 ] ) string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )
La fonction peut accepter 1, 2 ou 4 paramètres (voir l'implémentation du code pour plus de détails).
Si seul le premier paramètre est fourni, la partie décimale du nombre sera supprimée, et chaque séparateur de milliers est une virgule minuscule anglaise ","
Si deux paramètres sont fournis, le nombre sera retenu Le nombre de chiffres après que le point décimal atteigne la valeur que vous avez définie, et le reste est le même que ci-dessus
Si quatre paramètres sont fournis, le nombre conservera la partie décimale de la longueur des décimales, le point décimal est remplacé par dec_point ; , et le séparateur des milliers est remplacé par des milliers_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; } } /* }}} */
_php_math_number_format_ex
Implémentation de la fonction Divers numéros de paramètres finiront par appeler la fonction _php_math_number_format_ex. Ce que fait principalement la fonction est :
Traiter les nombres négatifs ;
Arrondir les nombres à virgule flottante en fonction de la virgule décimale à conserver
Appeler la fonction strpprintf pour convertir les expressions à virgule flottante en représentation sous forme de chaîne ; 🎜> Calculer la longueur de la chaîne qui doit être attribuée à la variable de résultat
Copiez le résultat dans la valeur de retour (s'il y a des milliers de caractères, effectuez une division en milliers de caractères)
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!