Heim  >  Artikel  >  Backend-Entwicklung  >  PHP liest die Quellcodefreigabe der Funktion „number_format“.

PHP liest die Quellcodefreigabe der Funktion „number_format“.

黄舟
黄舟Original
2017-09-22 09:11:552117Durchsuche

Das letzte Mal habe ich darüber gesprochen, wie PHP große Ganzzahlen analysiert. Dann habe ich den Quellcode dieser Funktion im Detail gelesen.

Funktionsprototyp

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

string number_format ( float $number , int $decimals = 0 , string $dec_point = "." , string $thousands_sep = "," )

Die Funktion kann 1, 2 oder 4 Parameter akzeptieren (Einzelheiten finden Sie in der Code-Implementierung).

Wenn nur der erste Parameter angegeben wird, wird der Dezimalteil der Zahl entfernt und jedes Tausendertrennzeichen ist ein englisches Kleinbuchstabe ",";
Wenn zwei Parameter angegeben werden, wird die Zahl so angezeigt beibehalten Die Anzahl der Stellen nach dem Dezimalpunkt erreicht den von Ihnen festgelegten Wert, der Rest ist derselbe wie oben.
Wenn vier Parameter angegeben werden, behält Zahl den Dezimalteil der Dezimallänge bei und der Dezimalpunkt wird durch dec_point ersetzt , und das Tausendertrennzeichen wird durch tausende_sep ersetzt

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

Codeausführungsflussdiagramm

PHP liest die Quellcodefreigabe der Funktion „number_format“.

_php_math_number_format_ex

Funktionsimplementierung Verschiedene Parameternummern rufen schließlich die Funktion _php_math_number_format_ex auf. Was die Funktion hauptsächlich tut, ist:

Negative Zahlen verarbeiten;
Gleitkommazahlen entsprechend dem beizubehaltenden Dezimalpunkt runden;
Rufen Sie die Funktion strpprintf auf, um Gleitkommaausdrücke in eine Zeichenfolgendarstellung umzuwandeln 🎜> Berechnen Sie die Länge der Zeichenfolge, die der Ergebnisvariablen zugewiesen werden muss.
Kopieren Sie das Ergebnis in den Rückgabewert (wenn es Tausende Zeichen gibt, führen Sie eine Tausender-Zeichen-Aufteilung durch)

strpprintf

Diese Funktion dient dazu, die Konvertierung von Gleitkommazahlen und Zeichenfolgen zu realisieren. Wie oben erwähnt, erfolgt die Konvertierung letztendlich durch Aufrufen der Funktion php_conv_fp (hier erfolgt die Positionierung durch GDB-Debugging) und der Funktion php_conv_fp. ruft die Funktion zend_dtoa auf,

Ausführlichere Hinweise finden Sie im Github-Projekteinreichungsdatensatz.

Zusammenfassung

Nachdem ich den Quellcode dieser Funktion gelesen hatte, lernte ich die Implementierungsdetails der Konvertierung zwischen Gleitkommazahlen und Zeichenfolgen kennen Lernen.

Das obige ist der detaillierte Inhalt vonPHP liest die Quellcodefreigabe der Funktion „number_format“.. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn