Как получить число из строки php
Перейти к содержимому

Как получить число из строки php

  • автор:

Как получить число из строки php

В PHP строка ( string ) считается числовой, если её можно интерпретировать как целое ( int ) число или как число с плавающей точкой ( float ).

Формально с PHP 8.0.0:

WHITESPACES \s* LNUM [0-9]+ DNUM ([0-9]*[\.]) | ([\.][0-9]*) EXPONENT_DNUM (( | ) [eE][+-]? ) INT_NUM_STRING [+-]?  FLOAT_NUM_STRING [+-]? ( | ) NUM_STRING ( | )

В PHP также присутствует концепция префиксной числовой строки. Это строка, которая начинается как числовая и продолжается любыми другими символами.

Замечание:

Любая строка, содержащая букву E (без учёта регистра), ограниченную цифрами, будет восприниматься как число, выраженное в научной нотации. Это может привести к неожиданным результатам.

var_dump ( «0D1» == «000» ); // false, «0D1» — не научная нотация
var_dump ( «0E1» == «000» ); // true, «0E1» — это 0 * (10 ^ 1) или 0
var_dump ( «2E1» == «020» ); // true, «2E1» — это 2 * (10 ^ 1) или 20
?>

Строки, используемые в числовых контекстах

  1. Если строка числовая, представляет целое число и не превышает максимально допустимого значения для типа int (определённого в PHP_INT_MAX ), то она приводится к типу int . Иначе она приводится к типу float .
  2. Если в заданном контексте дозволительно использовать префиксную числовую строку, то, если начало строки представляет целое число и не превышает максимально допустимого значения для типа int (определённого в PHP_INT_MAX ), то она приводится к типу int . Иначе она приводится к типу float . Также, в этом случае, выдаётся ошибка уровня E_WARNING .
  3. Если строка не числовая — выбрасывается исключение TypeError .

Поведение до PHP 8.0.0

До PHP 8.0.0 строка считалась числовой только в случае, если она начиналась с пробельных символов. Если она завершалась пробельными символами — она считалась префиксной числовой.

  • Использование префиксной числовой строки вызывало ошибку уровня E_NOTICE , а не E_WARNING .
  • Если строка не являлась числовой, вызывалась ошибка уровня E_WARNING , а сама строка приводилась к числу 0 .

$foo = 1 + «10.5» ; // $foo — число с плавающей точкой (11.5)
$foo = 1 + «-1.3e3» ; // $foo — число с плавающей точкой (-1299)
$foo = 1 + «bob-1.3e3» ; // TypeError начиная с PHP 8.0.0. Ранее $foo принималось за целое число (1)
$foo = 1 + «bob3» ; // TypeError начиная с PHP 8.0.0, Ранее $foo принималось за целое число (1)
$foo = 1 + «10 Small Pigs» ; // $foo — целое (11). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
$foo = 4 + «10.2 Little Piggies» ; // $foo — число с плавающей точкой (14.2). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
$foo = «10.0 pigs » + 1 ; // $foo — число с плавающей точкой (11). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
$foo = «10.0 pigs » + 1.0 ; // $foo — число с плавающей точкой (11). В PHP 8.0.0 выдаётся ошибка уровня E_WARNING, а в более ранних версиях — уровня E_NOTICE
?>

User Contributed Notes

There are no user contributed notes for this page.

  • Типы
    • Введение
    • Система типов
    • NULL
    • Логические значения
    • Целые числа
    • Числа с плавающей точкой
    • Строки
    • Числовые строки
    • Массивы
    • Объекты
    • Перечисления
    • Ресурсы
    • Callable и callback-​функции
    • Mixed
    • Void
    • Never
    • Относительные типы классов
    • Типы значений
    • Итерируемые значения
    • Объявления типов
    • Манипуляции с типами
    • Copyright © 2001-2024 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

    substr_count

    substr_count() возвращает число вхождений подстроки needle в строку haystack . Заметьте, что параметр needle чувствителен к регистру.

    Замечание:

    Эта функция не подсчитывает перекрывающиеся подстроки. Смотрите пример ниже!

    Список параметров

    Строка, в которой ведётся поиск

    Смещение начала отсчёта. Если задано отрицательное значение, отсчёт позиции будет произведён с конца строки.

    Максимальная длина строки, в которой будет производится поиск подстроки после указанного смещения. Если сумма смещения и максимальной длины будет больше длины haystack , то будет выведено предупреждение. Отрицательное значение будет отсчитываться с конца haystack .

    Возвращаемые значения

    Эта функция возвращает целое число ( int ).

    Список изменений

    Версия Описание
    8.0.0 length теперь допускает значение null.
    7.1.0 Добавлена поддержка отрицательных значений offset и length . length теперь также может быть 0 .

    Примеры

    Пример #1 Пример использования substr_count()

    $text = ‘This is a test’ ;
    echo strlen ( $text ); // 14

    echo substr_count ( $text , ‘is’ ); // 2

    // строка уменьшается до ‘s is a test’, поэтому вывод будет 1
    echo substr_count ( $text , ‘is’ , 3 );

    // текст уменьшается до ‘s i’, поэтому вывод будет 0
    echo substr_count ( $text , ‘is’ , 3 , 3 );

    // генерирует предупреждение, так как 5+10 > 14
    echo substr_count ( $text , ‘is’ , 5 , 10 );

    // выводит только 1, т.к. перекрывающиеся подстроки не учитываются
    $text2 = ‘gcdgcdgcd’ ;
    echo substr_count ( $text2 , ‘gcdgcd’ );
    ?>

    Смотрите также

    • count_chars() — Возвращает информацию о символах, входящих в строку
    • strpos() — Возвращает позицию первого вхождения подстроки
    • substr() — Возвращает подстроку
    • strstr() — Находит первое вхождение подстроки

    User Contributed Notes 10 notes

    7 years ago

    It’s worth noting this function is surprisingly fast. I first ran it against a ~500KB string on our web server. It found 6 occurrences of the needle I was looking for in 0.0000 seconds. Yes, it ran faster than microtime() could measure.

    Looking to give it a challenge, I then ran it on a Mac laptop from 2010 against a 120.5MB string. For one test needle, it found 2385 occurrences in 0.0266 seconds. Another test needs found 290 occurrences in 0.114 seconds.

    Long story short, if you’re wondering whether this function is slowing down your script, the answer is probably not.

    17 years ago

    Making this case insensitive is easy for anyone who needs this. Simply convert the haystack and the needle to the same case (upper or lower).

    8 years ago

    To account for the case that jrhodes has pointed out, we can change the line to:

    substr_count ( implode( ‘,’, $haystackArray ), $needle );

    array (
    0 => «mystringth»,
    1 => «atislong»
    );

    Which brings the count for $needle = «that» to 0 again.

    14 years ago

    It was suggested to use

    substr_count ( implode( $haystackArray ), $needle );

    instead of the function described previously, however this has one flaw. For example this array:

    array (
    0 => «mystringth»,
    1 => «atislong»
    );

    If you are counting «that», the implode version will return 1, but the function previously described will return 0.

    16 years ago

    a simple version for an array needle (multiply sub-strings):

    function substr_count_array ( $haystack , $needle ) $count = 0 ;
    foreach ( $needle as $substring ) $count += substr_count ( $haystack , $substring );
    >
    return $count ;
    >
    ?>

    20 years ago

    Yet another reference to the «cgcgcgcgcgcgc» example posted by «chris at pecoraro dot net»:

    Your request can be fulfilled with the Perl compatible regular expressions and their lookahead and lookbehind features.

    $number_of_full_pattern = preg_match_all(‘/(cgc)/’, «cgcgcgcgcgcgcg», $chunks);

    works like the substr_count function. The variable $number_of_full_pattern has the value 3, because the default behavior of Perl compatible regular expressions is to consume the characters of the string subject that were matched by the (sub)pattern. That is, the pointer will be moved to the end of the matched substring.
    But we can use the lookahead feature that disables the moving of the pointer:

    $number_of_full_pattern = preg_match_all(‘/(cg(?=c))/’, «cgcgcgcgcgcgcg», $chunks);

    In this case the variable $number_of_full_pattern has the value 6.
    Firstly a string «cg» will be matched and the pointer will be moved to the end of this string. Then the regular expression looks ahead whether a ‘c’ can be matched. Despite of the occurence of the character ‘c’ the pointer is not moved.

    10 years ago

    Unicode example with «case-sensitive» option;

    function substr_count_unicode ( $str , $substr , $caseSensitive = true , $offset = 0 , $length = null ) if ( $offset ) $str = substr_unicode ( $str , $offset , $length );
    >

    $pattern = $caseSensitive
    ? ‘~(?:’ . preg_quote ( $substr ) . ‘)~u’
    : ‘~(?:’ . preg_quote ( $substr ) . ‘)~ui’ ;
    preg_match_all ( $pattern , $str , $matches );

    return isset( $matches [ 0 ]) ? count ( $matches [ 0 ]) : 0 ;
    >

    function substr_unicode ( $str , $start , $length = null ) return join ( » , array_slice (
    preg_split ( ‘~~u’ , $str , — 1 , PREG_SPLIT_NO_EMPTY ), $start , $length ));
    >

    $s = ‘Ümit yüzüm gözüm. ‘ ;
    print substr_count_unicode ( $s , ‘ü’ ); // 3
    print substr_count_unicode ( $s , ‘ü’ , false ); // 4
    print substr_count_unicode ( $s , ‘ü’ , false , 10 ); // 1

    print substr_count_unicode ( $s , ‘üm’ ); // 2
    print substr_count_unicode ( $s , ‘üm’ , false ); // 3
    ?>

    15 years ago

    below was suggested a function for substr_count’ing an array, yet for a simpler procedure, use the following:

    substr_count ( implode ( $haystackArray ), $needle );
    ?>

    14 years ago

    In regards to anyone thinking of using code contributed by zmindster at gmail dot com

    Please take careful consideration of possible edge cases with that regex, in example:

    This would cause a infinite loop and for example be a possible entry point for a denial of service attack. A correct fix would require additional code, a quick hack would be just adding a additional check, without clarity or performance in mind:

    9 years ago

    This will handle a string where it is unknown if comma or period are used as thousand or decimal separator. Only exception where this leads to a conflict is when there is only a single comma or period and 3 possible decimals (123.456 or 123,456). An optional parameter is passed to handle this case (assume thousands, assume decimal, decimal when period, decimal when comma). It assumes an input string in any of the formats listed below.

    function toFloat($pString, $seperatorOnConflict=»f»)
    $decSeperator=».»;
    $thSeperator=»»;

    $pString=str_replace(» «, $thSeperator, $pString);

    $firstPeriod=strpos($pString, «.»);
    $firstComma=strpos($pString, «,»);
    if($firstPeriod!==FALSE && $firstComma!==FALSE) if($firstPeriod <$firstComma) $pString=str_replace(".", $thSeperator, $pString);
    $pString=str_replace(«,», $decSeperator, $pString);
    >
    else $pString=str_replace(«,», $thSeperator, $pString);
    >
    >
    else if($firstPeriod!==FALSE || $firstComma!==FALSE) $seperator=$firstPeriod!==FALSE?».»:»,»;
    if(substr_count($pString, $seperator)==1) $lastPeriodOrComma=strpos($pString, $seperator);
    if($lastPeriodOrComma==(strlen($pString)-4) && ($seperatorOnConflict!=$seperator && $seperatorOnConflict!=»f»)) $pString=str_replace($seperator, $thSeperator, $pString);
    >
    else $pString=str_replace($seperator, $decSeperator, $pString);
    >
    >
    else $pString=str_replace($seperator, $thSeperator, $pString);
    >
    >
    return(float)$pString;
    >

    strval

    Возвращает строковое значение переменной. Смотрите документацию по типу string для более подробной информации о преобразовании в строку.

    Эта функция не производит форматирование возвращаемого значения. Если необходимо привести числовое значение к строке с особым форматом, воспользуйтесь sprintf() или number_format() .

    Список параметров

    Переменная, которую необходимо преобразовать в строку.

    value может быть любого скалярного типа, null или объектом ( object ), который реализует метод __toString(). strval() нельзя применить к массиву или объекту, которые не реализуют метод __toString().

    Возвращаемые значения

    Строковое значение ( string ) параметра value .

    Примеры

    Пример #1 Пример использования strval() с магическим методом PHP __toString().

    class StrValTest
    public function __toString ()
    return __CLASS__ ;
    >
    >

    // Выводит ‘StrValTest’
    echo strval (new StrValTest );
    ?>

    Смотрите также

    • boolval() — Возвращает логическое значение переменной
    • floatval() — Возвращает значение переменной в виде числа с плавающей точкой
    • intval() — Возвращает целочисленное значение переменной
    • settype() — Задаёт тип переменной
    • sprintf() — Возвращает отформатированную строку
    • number_format() — Форматирует число с разделением групп
    • Манипуляции с типами
    • __toString()

    User Contributed Notes 9 notes

    7 years ago

    Some notes about how this function has changed over time, with regards the following statement:

    > You cannot use strval() on arrays or on objects that
    > do not implement the __toString() method.

    In PHP 5.3 and below, strval(array(1, 2, 3)) would return the string «Array» without any sort of error occurring.

    From 5.4 and above, the return value is unchanged but you will now get a notice-level error: «Array to string conversion».

    For objects that do not implement __toString(), the behaviour has varied:

    PHP 4: «Object»
    PHP 5 < 5.2: "Object id #1" (number obviously varies)
    PHP >= 5.2: Catchable fatal error: Object of class X could not be converted to string

    16 years ago

    As of PHP 5.2, strval() will return the string value of an object, calling its __toString() method to determine what that value is.

    19 years ago

    If you want to convert an integer into an English word string, eg. 29 -> twenty-nine, then here’s a function to do it.

    Note on use of fmod()
    I used the floating point fmod() in preference to the % operator, because % converts the operands to int, corrupting values outside of the range [-2147483648, 2147483647]

    I haven’t bothered with «billion» because the word means 10e9 or 10e12 depending who you ask.

    The function returns ‘#’ if the argument does not represent a whole number.

    $nwords = array( «zero» , «one» , «two» , «three» , «four» , «five» , «six» , «seven» ,
    «eight» , «nine» , «ten» , «eleven» , «twelve» , «thirteen» ,
    «fourteen» , «fifteen» , «sixteen» , «seventeen» , «eighteen» ,
    «nineteen» , «twenty» , 30 => «thirty» , 40 => «forty» ,
    50 => «fifty» , 60 => «sixty» , 70 => «seventy» , 80 => «eighty» ,
    90 => «ninety» );

    function int_to_words ( $x ) global $nwords ;

    if(! is_numeric ( $x ))
    $w = ‘#’ ;
    else if( fmod ( $x , 1 ) != 0 )
    $w = ‘#’ ;
    else if( $x < 0 ) $w = 'minus ' ;
    $x = — $x ;
    > else
    $w = » ;
    // . now $x is a non-negative integer.

    if( $x < 21 ) // 0 to 20
    $w .= $nwords [ $x ];
    else if( $x < 100 ) < // 21 to 99
    $w .= $nwords [ 10 * floor ( $x / 10 )];
    $r = fmod ( $x , 10 );
    if( $r > 0 )
    $w .= ‘-‘ . $nwords [ $r ];
    > else if( $x < 1000 ) < // 100 to 999
    $w .= $nwords [ floor ( $x / 100 )] . ‘ hundred’ ;
    $r = fmod ( $x , 100 );
    if( $r > 0 )
    $w .= ‘ and ‘ . int_to_words ( $r );
    > else if( $x < 1000000 ) < // 1000 to 999999
    $w .= int_to_words ( floor ( $x / 1000 )) . ‘ thousand’ ;
    $r = fmod ( $x , 1000 );
    if( $r > 0 ) $w .= ‘ ‘ ;
    if( $r < 100 )
    $w .= ‘and ‘ ;
    $w .= int_to_words ( $r );
    >
    > else < // millions
    $w .= int_to_words ( floor ( $x / 1000000 )) . ‘ million’ ;
    $r = fmod ( $x , 1000000 );
    if( $r > 0 ) $w .= ‘ ‘ ;
    if( $r < 100 )
    $word .= ‘and ‘ ;
    $w .= int_to_words ( $r );
    >
    >
    >
    return $w ;
    >

    ?>

    Usage:
    echo ‘There are currently ‘ . int_to_words ( $count ) . ‘ members logged on.’ ;
    ?>

    18 years ago

    I can’t help being surprised that

    evaluates to true. It’s the same with strval and single quotes.
    === avoids it.

    Why does it matter? One of my suppliers, unbelievably, uses 0 to mean standard discount and 0.00 to mean no discount in their stock files.

    16 years ago

    The only way to convert a large float to a string is to use printf(‘%0.0f’,$float); instead of strval($float); (php 5.1.4).

    // strval() will lose digits around pow(2,45);
    echo pow(2,50); // 1.1258999068426E+015
    echo (string)pow(2,50); // 1.1258999068426E+015
    echo strval(pow(2,50)); // 1.1258999068426E+015

    // full conversion
    printf(‘%0.0f’,pow(2,50)); // 112589906846624
    echo sprintf(‘%0.0f’,pow(2,50)); // 112589906846624

    18 years ago

    It seems that one is being treated as an unsigned large int (32 bit), and the other as a signed large int (which has rolled over/under).

    2326201276 — (-1968766020) = 4294967296.

    16 years ago

    As of PHP 5.1.4 (I have not tested it in later versions), the strval function does not attempt to invoke the __toString method when it encounters an object. This simple wrapper function will handle this circumstance for you:

    /**
    * Returns the string value of a variable
    *
    * This differs from strval in that it invokes __toString if an object is given
    * and the object has that method
    */
    function stringVal ($value)
    // We use get_class_methods instead of method_exists to ensure that __toString is a public method
    if (is_object($value) && in_array(«__toString», get_class_methods($value)))
    return strval($value->__toString());
    else
    return strval($value);
    >

    17 years ago

    In complement to Tom Nicholson’s contribution, here is the french version (actually it’s possible to change the language, but you should check the syntax 😉 )

    function int_to_words($x) global $nwords;

    if(!is_numeric($x))
    $w = ‘#’;
    else if(fmod($x, 1) != 0)
    $w = ‘#’;
    else if($x < 0) $w = $nwords['minus'].' ';
    $x = -$x;
    > else
    $w = »;
    // . now $x is a non-negative integer.

    if($x < 21) // 0 to 20
    $w .= $nwords[$x];
    else if($x < 100) < // 21 to 99
    $w .= $nwords[10 * floor($x/10)];
    $r = fmod($x, 10);
    if($r > 0)
    $w .= ‘-‘. $nwords[$r];
    > else if($x < 1000) < // 100 to 999
    $w .= $nwords[floor($x/100)] .’ ‘.$nwords[‘hundred’];
    $r = fmod($x, 100);
    if($r > 0)
    $w .= ‘ ‘.$nwords[‘separator’].’ ‘. int_to_words($r);
    > else if($x < 1000000) < // 1000 to 999999
    $w .= int_to_words(floor($x/1000)) .’ ‘.$nwords[‘thousand’];
    $r = fmod($x, 1000);
    if($r > 0) $w .= ‘ ‘;
    if($r < 100)
    $w .= $nwords[‘separator’].’ ‘;
    $w .= int_to_words($r);

    >
    > else < // millions
    $w .= int_to_words(floor($x/1000000)) .’ ‘.$nwords[‘million’];
    $r = fmod($x, 1000000);
    if($r > 0) $w .= ‘ ‘;
    if($r < 100)
    $word .= $nwords[‘separator’].’ ‘;
    $w .= int_to_words($r);
    >
    >
    >
    return $w;
    >

    // Usage in English
    $nwords = array( «zero», «one», «two», «three», «four», «five», «six», «seven»,
    «eight», «nine», «ten», «eleven», «twelve», «thirteen»,
    «fourteen», «fifteen», «sixteen», «seventeen», «eighteen»,
    «nineteen», «twenty», 30 => «thirty», 40 => «forty»,
    50 => «fifty», 60 => «sixty», 70 => «seventy», 80 => «eighty»,
    90 => «ninety» , «hundred» => «hundred», «thousand»=> «thousand», «million»=>»million»,
    «separator»=>»and», «minus»=>»minus»);

    echo ‘There are currently ‘. int_to_words(-120223456) . ‘ members logged on.
    ‘;

    //Utilisation en Francais
    $nwords = array( «zéro», «un», «deux», «trois», «quatre», «cinq», «six», «sept»,
    «huit», «neuf», «dix», «onze», «douze», «treize»,
    «quatorze», «quinze», «seize», «dix-sept», «dix-huit»,
    «dix-neuf», «vingt», 30 => «trente», 40 => «quarante»,
    50 => «cinquante», 60 => «soixante», 70 => «soixante-dix», 80 => «quatre-vingt»,
    90 => «quatre-vingt-dix» , «hundred» => «cent», «thousand»=> «mille», «million»=>»million»,
    «separator»=>»», «minus»=>»moins»);

    echo ‘Il y a actuellement ‘. int_to_words(-120223456) . ‘ membres connectés.
    ‘;

    intval

    Возвращает целочисленное значение ( int ) переменной value , рассматривая ее как значение в системе счисления с основанием, которое определено в параметре base (по умолчанию основание равно 10). Функцию intval() нельзя использовать с объектами, попытка это сделать вызовет ошибку уровня E_WARNING и вернёт значение 1.

    Список параметров

    Скалярное значение для конвертации в целое

    Основание системы счисления для преобразования

    • если строка включает префикс «0x» (или «0X»), будет взято основание 16 (шестнадцатеричное);
    • иначе, если строка начинается с «0b» (или «0B»), будет взято основание 2 (двоичное);
    • иначе, если строка начинается с «0», будет взято основание 8 (восьмеричное);
    • иначе основание будет равно 10 (десятичая).

    Возвращаемые значения

    Функция возвращает целочисленное значение переменной value в случае успешного выполнения, или 0 в случае возникновения ошибки. Для пустых массивов возвращается 0, для непустых возвращается 1.

    Максимальное значение зависит от операционной системы. В 32-битных системах максимальное знаковое целое лежит в диапазоне от -2 147 483 648 до 2 147 483 647. Так, например, в такой системе, intval(‘1000000000000’) вернёт 2 147 483 647. Максимальное знаковое целое значение для 64-битных систем — 9 223 372 036 854 775 807.

    Для строк функция, скорее всего, вернёт 0, хотя это зависит от первого символа в строке. Будут применены общие правила преобразования в целые.

    Список изменений

    Версия Описание
    8.0.0 Уровень ошибки при преобразовании из объекта был изменён с E_NOTICE на E_WARNING .

    Примеры

    Пример #1 Примеры использования intval()

    Следующие примеры приведены для 64-битной системы.

    echo intval ( 42 ); // 42
    echo intval ( 4.2 ); // 4
    echo intval ( ’42’ ); // 42
    echo intval ( ‘+42’ ); // 42
    echo intval ( ‘-42’ ); // -42
    echo intval ( 042 ); // 34
    echo intval ( ‘042’ ); // 42
    echo intval ( 1e10 ); // 10000000000
    echo intval ( ‘1e10’ ); // 10000000000
    echo intval ( 0x1A ); // 26
    echo intval ( ‘0x1A’ ); // 0
    echo intval ( ‘0x1A’ , 0 ); // 26
    echo intval ( 42000000 ); // 42000000
    echo intval ( 420000000000000000000 ); // -4275113695319687168
    echo intval ( ‘420000000000000000000’ ); // 9223372036854775807
    echo intval ( 42 , 8 ); // 42
    echo intval ( ’42’ , 8 ); // 34
    echo intval (array()); // 0
    echo intval (array( ‘foo’ , ‘bar’ )); // 1
    echo intval ( false ); // 0
    echo intval ( true ); // 1
    ?>

    Примечания

    Замечание:

    Параметр base будет учтён только тогда, когда значение параметр value окажется строкой.

    Смотрите также

    • boolval() — Возвращает логическое значение переменной
    • floatval() — Возвращает значение переменной в виде числа с плавающей точкой
    • strval() — Возвращает строковое значение переменной
    • settype() — Задаёт тип переменной
    • is_numeric() — Проверяет, содержит ли переменная число или числовую строку
    • Манипуляции с типами
    • Математические функции произвольной точности BCMath

    User Contributed Notes 16 notes

    12 years ago
    Not mentioned elsewhere: intval(NULL) also returns 0.
    13 years ago

    $n = «19.99» ;
    print intval ( $n * 100 ); // prints 1998
    print intval ( strval ( $n * 100 )); // prints 1999
    ?>

    7 years ago

    It seems intval is interpreting valid numeric strings differently between PHP 5.6 and 7.0 on one hand, and PHP 7.1 on the other hand.

    echo intval ( ‘1e5’ );
    ?>

    will return 1 on PHP 5.6 and PHP 7.0,
    but it will return 100000 on PHP 7.1.

    23 years ago

    intval converts doubles to integers by truncating the fractional component of the number.

    When dealing with some values, this can give odd results. Consider the following:

    print intval ((0.1 + 0.7) * 10);

    This will most likely print out 7, instead of the expected value of 8.

    For more information, see the section on floating point numbers in the PHP manual (http://www.php.net/manual/language.types.double.php)

    Also note that if you try to convert a string to an integer, the result is often 0.

    However, if the leftmost character of a string looks like a valid numeric value, then PHP will keep reading the string until a character that is not valid in a number is encountered.

    «101 Dalmations» will convert to 101

    «$1,000,000» will convert to 0 (the 1st character is not a valid start for a number

    «80,000 leagues . » will convert to 80

    «1.4e98 microLenats were generated when. » will convert to 1.4e98

    Also note that only decimal base numbers are recognized in strings.

    «099» will convert to 99, while «0x99» will convert to 0.

    One additional note on the behavior of intval. If you specify the base argument, the var argument should be a string — otherwise the base will not be applied.

    print intval (77, 8); // Prints 77
    print intval (’77’, 8); // Prints 63

    18 years ago

    You guys are going to love this. I found something that I found quite disturbing.

    $amount = 19.99 * 100;
    $test2 = intVal($amount);
    $test3 = intVal(«$amount»);

    Appears to be a floating point issue, but the number 1999 is the only number that I was able to get to do this. 19.99 is the price of many things, and for our purpose we must pass it as 1999 instead of 19.99.

    14 years ago

    Here is a really useful undocumented feature:

    You can have it automatically deduce the base of the number from the prefix of the string using the same syntax as integer literals in PHP («0x» for hexadecimal, «0» for octal, non-«0» for decimal) by passing a base of 0 to intval():

    echo intval ( «0x1a» , 0 ), «\n» ; // hex; prints «26»
    echo intval ( «057» , 0 ), «\n» ; // octal; prints «47»
    echo intval ( «42» , 0 ), «\n» ; // decimal; prints «42»
    ?>

    4 years ago

    $test = intval(150.20*100); //15019
    $test2 = intval(15020); //15020
    $test3 = intval(15020.0); //15020
    $test4 = 150.20*100; //15020.0

    5 years ago

    The binary notation is NOT supported until php7.2
    // PHP =7.2
    echo intval ( 0b11 ); // 3 | 3
    echo intval (- 0b11 ); // -3 | -3
    echo intval ( ‘0b11’ ); // 0 | 0
    echo intval ( ‘-0b11’ ); // 0 | 0
    echo intval ( ‘0b11’ , 0 ); // 0 | 3
    echo intval ( ‘-0b11’ , 0 ); // 0 | -3
    ?>

    10 years ago

    if you want to take a number from a string, no matter what it may contain, here is a good solution:

    echo int ( ‘j18ugj9hu0gj5hg’ );
    //output: 18
    ?>
    this example returns an int, so it will follow the int rules, and has support for negative values.

    echo int ( ‘j-1809809808908099878758765ugj9hu0gj5hg’ );
    //output: -1809809808908099878758765
    ?>

    this one returns a string with just the numeric value.
    it also supports negative values.

    the latter is better when you have a 32 bit system and you want a huge int that is higher than PHP_MAX_INT.

    3 years ago

    As a warning, do not use this function alone for input validation.

    Vulnerable example:
    if(isset( $_GET [ ‘id’ ]) && intval ( $_GET [ ‘id’ ]) > 0 ) echo $id ;
    >
    ?>

    The following requests would pass this filter:

    Instead use the is_numeric() function for integer validation:

    20 years ago

    Sometimes intval just won’t cut it. For example if you want to use an unsigned 32-bit int and need all 32 bits. Recently, I wrote a little script that took and integer and converted it to an IP address. After realizing I couldn’t just mod the whole thing, since the sign bit throws it off (and compensating for that), we ran into a problem where if it was entered into a form, the value somehow wasn’t converted to an integer properly, at least not implicitly. The solution for this, and the way I recommend converting a string to an integer, is:

    and PHP will leave your number alone; it’ll just know it’s a number. Such is the fun of a loosely-typed language. 🙂

    17 years ago

    As addendum, the «if ($int > 0)» check in the encode function is redundant. It doesn’t do anything bad to keep it in since it will always be true when reaching that point, but it’s a meaningless conditional this way. It’s a remnant from when I tried to write the function in terms of bitshifts, which could lead to negative ints when shifting if the 32nd bit was set (instead of always padding with 0’s when using >> it pads with 1’s leading to negative ints).

    10 years ago

    Do not use intval() when you really want round(). This is due to how PHP handles precision.

    echo number_format(8.20*100, 20), «
    «;
    echo intval(8.20*100), «
    «;
    echo floor(8.20*100), «
    «;
    echo round(8.20*100), «
    «;

    8 years ago

    // observe the following
    echo intval ( strval ( — 0.0001 ) ); // 0
    echo intval ( strval ( — 0.00001 ) ); // -1

    // this is because
    echo strval ( — 0.0001 ); // -.0001
    echo strval ( — 0.00001 ); // -1.0E-5

    // thus beware when using
    function trunc2_bad ( $n ) return intval ( strval ( $n * 100 ) / 100 );
    >

    // use this instead
    function trunc2_good ( $n ) return intval ( floatval ( strval ( $n * 100 ) ) / 100 );
    >

    13 years ago

    The behaviour of intval() is interesting when supplying a base, and you better check your intval base-based expressions, as it is counter-intuitive.
    As the example shows
    intval ( ’42’ , 8 ); // => 34
    intval ( 42 , 8 ); // => 42 !
    ?>
    PHP considers the 42 as being already an integer, and doesn’t apply any conversion. And supplying
    intval ( 49 , 8 ); // => 49 !
    ?>
    produces no error and no warning.

    26 days ago

    Warning: intval() parses scientific notation, like «12.3e7».

    This comes out of the blue when you use intval() to cut the first integer value from a string; at first glance there’s nothing wrong with it, if you have «123.jeff» it will give you 123, but in the rare case of parsing something that has a second segment with a hex number, you can easily run into this. (Let’s not start the «why would you parse a string like that» argument.)

    So if you’re not prepared, these results may surprise you:

    intval(«123.ee-2») — gives you 123
    intval(«123.e2-e») — gives you 12300
    intval(«123.a2-e») — gives you 123
    intval(«123.e-22») — gives you 0
    intval(«123.e-a2») — gives you 123
    intval(«123.e-2a») — gives you 1
    intval(«123.2e2a») — gives you 12320
    intval(«123.22e2») — gives you 12322
    intval(«123.22ea») — gives you 123

    Again, this is somewhat expected behaviour once you know that scientific notation is interpreted by it. But it looks like a less-than-widely known fact and I only faced this issue after 20+ years of php.

    • Copyright © 2001-2024 The PHP Group
    • My PHP.net
    • Contact
    • Other PHP.net sites
    • Privacy policy

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *