PHP は、number_format 関数のソースコード共有を読み取ります

黄舟
リリース: 2023-03-16 10:42:01
オリジナル
2120 人が閲覧しました

前回、PHP が大きな整数を解析する方法について説明し、number_format の処理について簡単に触れました。次に、この関数のソース コードを詳しく読みました。以下は簡単な分析です。

関数プロトタイプ

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

string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )
ログイン後にコピー

この関数は、1、2、および 4 つのパラメーターを受け入れることができます (詳細については、コードの実装を参照してください)。

最初のパラメータのみが指定された場合、number の小数部分は削除され、各千の区切り文字は英語の小文字のカンマ「,」になります。
2 つのパラメータが指定された場合、number は小数点以下の桁数を保持します。設定する値は上記と同じです
4 つのパラメーターが指定された場合、number は小数点以下の長さの小数部分を保持し、小数点は dec_point に置き換えられ、桁区切り記号は suffix_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;
    }
}
/* }}} */
ログイン後にコピー

コード実行フローチャート

PHP は、number_format 関数のソースコード共有を読み取ります

_php_math_number_format_ex

関数によって実装されたさまざまなパラメータの数値は、最終的に _php_math_number_format_ex 関数を呼び出します。この関数は主に次のことを行います:

負の数値を処理します。

保持する小数点に従って浮動小数点数を丸めます。
浮動小数点式を文字列表現に変換します。
必要な文字列の長さを計算します。結果変数に代入する;
結果を戻り値にコピーする (千文字がある場合は、千文字ごとに分割する)

strpprintf

この関数は、前述のように、浮動小数点数と文字列を変換します。 php_conv_fp 関数が最終的に呼び出されます。変換 (ここでは gdb デバッグを通じて行われた位置決めです)、そして php_conv_fp 関数がトレースダウンし、zend_dtoa 関数を呼び出します。

より詳細な注釈については、github プロジェクトの送信記録を参照してください。

概要

この関数のソースコードを読んだ後、私が学んだことは、浮動小数点数と文字列の変換の実装の詳細です。文字列と浮動小数点数の関係はさらに複雑なので、後ほど学習します。

以上がPHP は、number_format 関数のソースコード共有を読み取りますの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート