PHP: Hypertext Preprocessor (original) (raw)

is_float

(PHP 4, PHP 5, PHP 7, PHP 8)

is_float — Finds whether the type of a variable is float

Description

Note:

To test if a variable is a number or a numeric string (such as form input, which is always a string), you must useis_numeric().

Parameters

value

The variable being evaluated.

Examples

Example #1 is_float() example

`<?php

var_dump

(is_float(27.25));
var_dump(is_float('abc'));
var_dump(is_float(23));
var_dump(is_float(23.5));
var_dump(is_float(1e7)); //Scientific Notation
var_dump(is_float(true));
?>`

The above example will output:

bool(true) bool(false) bool(false) bool(true) bool(true) bool(false)

See Also

Found A Problem?

nonzer0value

10 years ago

`Coercing the value to float and back to string was a neat trick. You can also just add a literal 0 to whatever you're checking.

Seems to work ok:

YMMV

`

Boylett

16 years ago

`If you want to test whether a string is containing a float, rather than if a variable is a float, you can use this simple little function:

function isfloat($f) return ($f == (string)(float)$f);

`

Anonymous

4 years ago

is_float() returns true for NAN, INF and -INF. You may want to test is_float($value) && is_finite($value), or alternatively filter_var($value, FILTER_VALIDATE_FLOAT) !== false.

kshegunov at gmail dot com

17 years ago

`As celelibi at gmail dot com stated, is_float checks ONLY the type of the variable not the data it holds!

If you want to check if string represent a floating point value use the following regular expression and not is_float(),
or poorly written custom functions.

/^[+-]?(([0-9]+)|([0-9].[0-9]+|[0-9]+.[0-9])|
(([0-9]+|([0-9].[0-9]+|[0-9]+.[0-9]))[eE][+-]?[0-9]+))$/

`

Erutan409 at Hotmail dot com

9 years ago

`Boylett's solution is elegant (http://php.net/manual/en/function.is-float.php#85848), but won't work for long float's or variables that are not explicitly type of 'string' or for long floats that are encased in quotes, making it a string that will be truncated/rounded when cast to a float. So, further logic must be completed to test for the case. Take the following example:

test="3.14159265358979323846264338g32795";vardump(test = "3.14159265358979323846264338g32795";var_dump(test="3.14159265358979323846264338g32795";vardump(test); var_dump((float)$test); var_dump($test == (string)(float)$test); var_dump(test_float($test));?>

Will produce (32-bit):

string(34) "3.14159265358979323846264338g32795"
float(3.1415926535898)
bool(false)
bool(false)

So far, so good, right? Yeah, but it's misleading, because the string is so long, that when it's converted to a float, it won't be equivalent to the comparison of the value being cast back into a string . So the aforementioned short function works. Look at this next example:

Will produce (32-bit):

float(3.1415926535898)
float(3.1415926535898)
bool(false)
bool(true)

Why is it not working now, but the value is truly a float? Same reasoning as mentioned before. The float is so long that it's truncated/rounded and doesn't match the comparison being done with the short-hand function.

So, as you can see, more logic should be applied to the variable you're testing.

`

KIVagant at gmail dot com

12 years ago

`Yet another regular expression for float in real life:

pattern=′/[−+]?(((d+).?(d+)?)∣.d+)([eE]?[+−]?d+)?pattern = '/^[-+]?(((\\\\d+)\\\\.?(\\\\d+)?)|\\\\.\\\\d+)([eE]?[+-]?\\\\d+)?pattern=/[+]?(((d+).?(d+)?).d+)([eE]?[+]?d+)?/'; return (! is_bool($val) && (is_float($val) || preg_match($pattern, trim($val)))); } ?>

// Matches:
1, -1, 1.0, -1.0, '1', '-1', '1.0', '-1.0', '2.1', '0', 0, ' 0 ', ' 0.1 ', ' -0.0 ', -0.0, 3., '-3.', '.27', .27, '-0', '+4', '1e2', '+1353.0316547', '13213.032468e-13465', '-8E+3', '-1354.98879e+37436'

// Non-matches:
false, true, '', '-', '.a', '-1.a', '.a', '.', '-.', '1+', '1.3+', 'a1', 'e.e', '-e-4', 'e2', '8e', '3,25'

`