Php int to float

Php int to float

Приведение типа — это преобразование значения одного типа в значение другого типа.

Есть два вида приведения типов:

Неявное приведение типа выполняется интерпретатором автоматически, без непосредственного участия программиста. Например, значение будет автоматически преобразовано, если оператор ожидает, числовые операнды:

Чтобы выполнить явное приведение, нужно указать в круглых скобках имя требуемого типа непосредственно перед приводимым значением или переменной:

Запись имени типа в круглых скобках называется оператором приведения типа. Допускаются следующие операторы приведения типов:

  • (int), (integer) — приведение к integer .
  • (bool), (boolean) — приведение к boolean .
  • (float), (double), (real) — приведение к float .
  • (string) — приведение к string .
  • (array) — приведение к array .
  • (object) — приведение к object .
  • (unset) — приведение к NULL .

Приведение к целому числу

При приведении bool в integer , FALSE преобразуется в 0 (нуль), а TRUE — в 1 (единицу). При приведении float в integer , дробная часть будет округлена в сторону нуля. Значение NULL преобразуется в 0:

Строки преобразуются по следующим правилам:

  • Если первый символ строки является цифрой, знаком + или — , то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ отличный от цифры, после этого интерпретатор возвращает полученное целое число.
  • Если строка пустая или первый символ строки не является цифрой, знаком + или — , она преобразуется в 0.

Для других типов поведение преобразования в integer не определено. Поэтому не нужно полагаться на любое наблюдаемое поведение, так как оно может измениться без предупреждения.

Приведение к числу с плавающей точкой

Строки преобразуются по следующим правилам:

  • Если первый символ строки является цифрой, точкой, знаком + или — , то интерпретатор переходит к анализу второго символа, если второй символ строки является цифрой, точкой (если перед этим была цифра), буквой e или E (если перед этим была цифра или точка), то интерпретатор переходит к анализу третьего символа и так до тех пор, пока не будет обнаружен символ, который не может быть преобразован в числовое значение, после этого интерпретатор возвращает полученное число с плавающей точкой.
  • Если строка пустая или первый символ строки не является цифрой, точкой, знаком + или — , она преобразуется в 0.

Значения других типов сначала преобразуются в integer , а затем уже из integer происходит преобразование в тип float .

Приведение к булеву типу

Следующие значения в результате преобразования дают значение FALSE :

  • само значение FALSE
  • 0 и 0.0 (нуль)
  • пустая строка, и строка "0"
  • массив без элементов
  • NULL
  • Объекты SimpleXML , созданные из пустых тегов

Все остальные значения при преобразовании дают в результате значение TRUE . Значение FALSE и шесть значений, которые при преобразовании приводятся к этому значению, обычно называют ложными значениями, а все остальные — истинными:

В любом контексте, когда интерпретатор PHP ожидает получить булево значение, ложные значения интерпретируются как FALSE , а истинные значения — как TRUE .

Приведение к строке

Булево значение TRUE преобразуется в строку "1", а значение FALSE преобразуется в "" (пустую строку):

Целое число или число с плавающей точкой преобразуется в строку, состоящую из цифр числа:

Читайте также:  Boot camp как обратно включить os x

Массивы всегда преобразуются в строку "Array" :

NULL всегда преобразуется в пустую строку:

Resource всегда преобразуется в строку вида "Resource id #1" .

Для преобразования объекта в строку, объект должен иметь метод __toString() :

Если объект не имеет метод __toString() , то в результате преобразования будет вызвана фатальная ошибка:

Приведение к NULL

Приведение к типу NULL не удаляет переменную и её значение, а лишь возвращает значение типа NULL :

Casting objects to arrays is a pain. Example:

private $priv = ‘priv_value’ ;
protected $prot = ‘prot_value’ ;
public $pub = ‘pub_value’ ;
public $MyClasspriv = ‘second_pub_value’ ;

$test = new MyClass ();
echo ‘

‘ ;
print_r ((array) $test );

/*
Array
(
[MyClasspriv] => priv_value
[*prot] => prot_value
[pub] => pub_value
[MyClasspriv] => second_pub_value
)
*/

?>

Yes, that looks like an array with two keys with the same name and it looks like the protected field was prepended with an asterisk. But that’s not true:

foreach ((array) $test as $key => $value ) <
$len = strlen ( $key );
echo " < $key >( < $len >) => < $value >
" ;
for ( $i = 0 ; $i $len ; ++ $i ) <
echo ord ( $key [ $i ]) . ‘ ‘ ;
>
echo ‘ ‘ ;
>

/*
MyClasspriv (13) => priv_value
0 77 121 67 108 97 115 115 0 112 114 105 118
*prot (7) => prot_value
0 42 0 112 114 111 116
pub (3) => pub_value
112 117 98
MyClasspriv (11) => second_pub_value
77 121 67 108 97 115 115 112 114 105 118
*/

?>

The char codes show that the protected keys are prepended with ‘*’ and private keys are prepended with ‘’.__CLASS__.’’ so be careful when playing around with this.

The object casting methods presented here do not take into account the class hierarchy of the class you’re trying to cast your object into.

/**
* Convert an object to a specific class.
* @param object $object
* @param string $class_name The class to cast the object to
* @return object
*/
public static function cast($object, $class_name) <
if($object === false) return false;
if(class_exists($class_name)) <
$ser_object = serialize($object);
$obj_name_len = strlen(get_class($object));
$start = $obj_name_len + strlen($obj_name_len) + 6;
$new_object = ‘O:’ . strlen($class_name) . ‘:"’ . $class_name . ‘":’;
$new_object .= substr($ser_object, $start);
$new_object = unserialize($new_object);
/**
* The new object is of the correct type but
* is not fully initialized throughout its graph.
* To get the full object graph (including parent
* class data, we need to create a new instance of
* the specified class and then assign the new
* properties to it.
*/
$graph = new $class_name;
foreach($new_object as $prop => $val) <
$graph->$prop = $val;
>
return $graph;
> else <
throw new CoreException(false, "could not find class $class_name for casting in DB::cast");
return false;
>
>

Type casting from string to int and vice versa is probably the most common conversation. PHP does this very simply through the +. and .= operators, removing any explicit casting:

Читайте также:  Mail моя страница восстановить

= 1 ;
var_dump ( $x ); // int(1)
$x .= 1 ;
var_dump ( $x ); // string(2) "11"; also an empty string ("") would cast to string without changing $x

$x = "1" ;
var_dump ( $x ); // string(1) "1"
$x += 1 ;
var_dump ( $x ); // int(2); also a zero value (0) would cast to int without changing $x
?>

You REALLY must be aware what you are doing, when you cast a lot in your code. For example, you can accidentaly change FALSE to TRUE (probably not in one line, like here):

if(TRUE === (boolean) (array) (int) FALSE) <
kaboom();
>

Checking for strings to be integers?
How about if a string is a float?

/* checks if a string is an integer with possible whitespace before and/or after, and also isolates the integer */
$isInt = preg_match ( ‘/^s*([0-9]+)s*$/’ , $myString , $myInt );

echo ‘Is Integer? ‘ , ( $isInt ) ? ‘Yes: ‘ . $myInt [ 1 ] : ‘No’ , "
" ;

/* checks if a string is an integer with no whitespace before or after */
$isInt = preg_match ( ‘/^[0-9]+$/’ , $myString );

echo ‘Is Integer? ‘ , ( $isInt ) ? ‘Yes’ : ‘No’ , "
" ;

/* When checking for floats, we assume the possibility of no decimals needed. If you MUST require decimals (forcing the user to type 7.0 for example) replace the sequence:
[0-9]+(.[0-9]+)?
with
[0-9]+.[0-9]+
*/

/* checks if a string is a float with possible whitespace before and/or after, and also isolates the number */
$isFloat = preg_match ( ‘/^s*([0-9]+(.[0-9]+)?)s*$/’ , $myString , $myNum );

echo ‘Is Number? ‘ , ( $isFloat ) ? ‘Yes: ‘ . $myNum [ 1 ] : ‘No’ , "
" ;

/* checks if a string is a float with no whitespace before or after */
$isInt = preg_match ( ‘/^[0-9]+(.[0-9]+)?$/’ , $myString );

echo ‘Is Number? ‘ , ( $isFloat ) ? ‘Yes’ : ‘No’ , "
" ;

in response to bhsmither at gmail.com

It raises a warning because of the bad enquoted variable

$foo [ ‘ten’ ] = 10 ; // $foo[‘ten’] is an array holding an integer at key "ten"
$str = " < $foo [ ‘ten’ ]>" ; // works "10"
$str = " $foo [ ten ] " ; // DO NOT work!

It seems (unset) is pretty useless. But for people who like to make their code really compact (and probably unreadable). You can use it to use an variable and unset it on the same line:

= ‘Hello world’ ;
print $hello ;
unset( $hello );

?>

With the unset cast:

= ‘Hello world’ ;
$hello = (unset) print $hello ;

?>

Hoorah, we lost another line!

If you want to convert a string automatically to float or integer (e.g. "0.234" to float and "123" to int), simply add 0 to the string — PHP will do the rest.

$val = 0 + "1.234";
(type of $val is float now)

$val = 0 + "123";
(type of $val is integer now)

I found it tricky to check if a posted value was an integer.

is_int ( $_POST [ ‘a’ ] ); //false
is_int ( intval ( "anything" ) ); //always true
?>

A method I use for checking if a string represents an integer value.

Value of uninitialized variable of different data types.

settype($a,’bool’);
var_dump($a); //boolean false

Читайте также:  Mcafee consumer product removal

settype($b,’string’);
var_dump($b); //string » (length=0)

settype($c,’array’);
var_dump($c); //array (size=0) empty

settype($d,’int’);
var_dump($d); //int 0

settype($e,’float’);
var_dump($e); //float 0

namaroulis stated "I found it tricky to check if a posted value was an integer"; to test if a variable is a number or a numeric string (such as form input, which is always a string), you must use is_numeric():

is_numeric ( $_POST [ ‘a’ ] ); // true
?>

WHERE’S THE BEEF?

Looks like type-casting user-defined objects is a real pain, and ya gotta be nuttin’ less than a brain jus ta cypher-it. But since PHP supports OOP, you can add the capabilities right now. Start with any simple class.
class Point <
protected $x , $y ;

public function __construct ( $xVal = 0 , $yVal = 0 ) <
$this -> x = $xVal ;
$this -> y = $yVal ;
>
public function getX () < return $this ->x ; >
public function getY () < return $this ->y ; >
>

$p = new Point ( 25 , 35 );
echo $p -> getX (); // 25
echo $p -> getY (); // 35
?>
Ok, now we need extra powers. PHP gives us several options:
A. We can tag on extra properties on-the-fly using everyday PHP syntax.
$p->z = 45; // here, $p is still an object of type [Point] but gains no capability, and it’s on a per-instance basis, blah.
B. We can try type-casting it to a different type to access more functions.
$p = (SuperDuperPoint) $p; // if this is even allowed, I doubt it. But even if PHP lets this slide, the small amount of data Point holds would probably not be enough for the extra functions to work anyway. And we still need the class def + all extra data. We should have just instantiated a [SuperDuperPoint] object to begin with. and just like above, this only works on a per-instance basis.
C. Do it the right way using OOP — and just extend the Point class already.
class Point3D extends Point <
protected $z ; // add extra properties.

public function __construct ( $xVal = 0 , $yVal = 0 , $zVal = 0 ) <
parent :: __construct ( $xVal , $yVal );
$this -> z = $zVal ;
>
public function getZ () < return $this ->z ; > // add extra functions.
>

$p3d = new Point3D ( 25 , 35 , 45 ); // more data, more functions, more everything.
echo $p3d -> getX (); // 25
echo $p3d -> getY (); // 35
echo $p3d -> getZ (); // 45
?>
Once the new class definition is written, you can make as many Point3D objects as you want. Each of them will have more data and functions already built-in. This is much better than trying to beef-up any "single lesser object" on-the-fly, and it’s way easier to do.

I am running into troubles when I want to convert integer values to float (numbers with dots).

But it should echo 2.0 or 2.00

I also tried settype, without success. And I am finding only help/solutions/questions for "float to int".

Ссылка на основную публикацию
Adblock detector