PHP lit le partage du code source de la fonction number_format

黄舟
Libérer: 2023-03-16 10:42:01
original
2053 Les gens l'ont consulté

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.

Prototype de fonction

string number_format ( float $number [, int $decimals = 0 ] )

string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )
Copier après la connexion

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

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;
    }
}
/* }}} */
Copier après la connexion

Organigramme d'exécution du code

PHP lit le partage du code source de la fonction number_format

_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)

strpprintf

Cette fonction est Pour réaliser la conversion de nombres à virgule flottante et de chaînes, comme mentionné ci-dessus, la conversion se fait finalement en appelant la fonction php_conv_fp (voici le positionnement effectué via le débogage gdb), et la fonction php_conv_fp, en traçant vers le bas, appelle la fonction zend_dtoa,

Pour des notes plus détaillées, consultez l'enregistrement de soumission de projet github.

Résumé

Après avoir lu le code source de cette fonction, j'ai appris les détails d'implémentation de la conversion entre nombres flottants et chaînes. La relation entre les chaînes et les nombres à virgule flottante est plus compliquée. apprentissage.

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal
À propos de nous Clause de non-responsabilité Sitemap
Site Web PHP chinois:Formation PHP en ligne sur le bien-être public,Aidez les apprenants PHP à grandir rapidement!