PHP: is_float - Manual (original) (raw)
(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
- is_bool() - Finds out whether a variable is a boolean
- is_int() - Find whether the type of a variable is integer
- is_numeric() - Finds whether a variable is a number or a numeric string
- is_string() - Find whether the type of a variable is string
- is_array() - Finds whether a variable is an array
- is_object() - Finds whether a variable is an object
Found A Problem?
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.
<?php
function isfloat($value) {
// PHP automagically tries to coerce $value to a number
return is_float($value + 0);
}
?>
Seems to work ok:
<?php
isfloat("5.0" + 0); // true
isfloat("5.0"); // false
isfloat(5 + 0); // false
isfloat(5.0 + 0); // false
isfloat('a' + 0); // false
?>
YMMV
17 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);
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.
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 ¶
10 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:
<?php
if (!function_exists("test_float")) {
function test_float($test) {
if (!is_scalar($test)) {return false;}
<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>t</mi><mi>y</mi><mi>p</mi><mi>e</mi><mo>=</mo><mi>g</mi><mi>e</mi><mi>t</mi><mi>t</mi><mi>y</mi><mi>p</mi><mi>e</mi><mo stretchy="false">(</mo></mrow><annotation encoding="application/x-tex">type = gettype(</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.8095em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">t</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord mathnormal">p</span><span class="mord mathnormal">e</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel">=</span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal" style="margin-right:0.03588em;">g</span><span class="mord mathnormal">e</span><span class="mord mathnormal">tt</span><span class="mord mathnormal" style="margin-right:0.03588em;">y</span><span class="mord mathnormal">p</span><span class="mord mathnormal">e</span><span class="mopen">(</span></span></span></span>test);
if ($type === "float") {
return true;
} else {
return preg_match("/^\\d+\\.\\d+$/", $test) === 1;
}
}
}
$test = "3.14159265358979323846264338g32795";
var_dump($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:
<?php
$test = 3.1415926535897932384626433832795;
var_dump($test);
var_dump((float)$test);
var_dump($test == (string)(float)$test);
var_dump(test_float($test));
?>
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.
13 years ago
Yet another regular expression for float in real life:
<?php
function isTrueFloat($val)
{
<span class="katex"><span class="katex-mathml"><math xmlns="http://www.w3.org/1998/Math/MathML"><semantics><mrow><mi>p</mi><mi>a</mi><mi>t</mi><mi>t</mi><mi>e</mi><mi>r</mi><mi>n</mi><msup><mo>=</mo><mo mathvariant="normal" lspace="0em" rspace="0em">′</mo></msup><msup><mi mathvariant="normal">/</mi><mo stretchy="false">[</mo></msup><mo>−</mo><mo>+</mo><mo stretchy="false">]</mo><mo stretchy="false">?</mo><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mo stretchy="false">(</mo><mspace linebreak="newline"></mspace><mspace linebreak="newline"></mspace><mi>d</mi><mo>+</mo><mo stretchy="false">)</mo><mspace linebreak="newline"></mspace><mspace linebreak="newline"></mspace><mi mathvariant="normal">.</mi><mo stretchy="false">?</mo><mo stretchy="false">(</mo><mspace linebreak="newline"></mspace><mspace linebreak="newline"></mspace><mi>d</mi><mo>+</mo><mo stretchy="false">)</mo><mo stretchy="false">?</mo><mo stretchy="false">)</mo><mi mathvariant="normal">∣</mi><mspace linebreak="newline"></mspace><mspace linebreak="newline"></mspace><mi mathvariant="normal">.</mi><mspace linebreak="newline"></mspace><mspace linebreak="newline"></mspace><mi>d</mi><mo>+</mo><mo stretchy="false">)</mo><mo stretchy="false">(</mo><mo stretchy="false">[</mo><mi>e</mi><mi>E</mi><mo stretchy="false">]</mo><mo stretchy="false">?</mo><mo stretchy="false">[</mo><mo>+</mo><mo>−</mo><mo stretchy="false">]</mo><mo stretchy="false">?</mo><mspace linebreak="newline"></mspace><mspace linebreak="newline"></mspace><mi>d</mi><mo>+</mo><mo stretchy="false">)</mo><mo stretchy="false">?</mo></mrow><annotation encoding="application/x-tex">pattern = '/^[-+]?(((\\\\d+)\\\\.?(\\\\d+)?)|\\\\.\\\\d+)([eE]?[+-]?\\\\d+)?</annotation></semantics></math></span><span class="katex-html" aria-hidden="true"><span class="base"><span class="strut" style="height:0.9463em;vertical-align:-0.1944em;"></span><span class="mord mathnormal">p</span><span class="mord mathnormal">a</span><span class="mord mathnormal">tt</span><span class="mord mathnormal" style="margin-right:0.02778em;">er</span><span class="mord mathnormal">n</span><span class="mspace" style="margin-right:0.2778em;"></span><span class="mrel"><span class="mrel">=</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.7519em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mord mtight"><span class="mord mtight">′</span></span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2778em;"></span></span><span class="base"><span class="strut" style="height:1.138em;vertical-align:-0.25em;"></span><span class="mord"><span class="mord">/</span><span class="msupsub"><span class="vlist-t"><span class="vlist-r"><span class="vlist" style="height:0.888em;"><span style="top:-3.063em;margin-right:0.05em;"><span class="pstrut" style="height:2.7em;"></span><span class="sizing reset-size6 size3 mtight"><span class="mopen mtight">[</span></span></span></span></span></span></span></span><span class="mspace" style="margin-right:0.2222em;"></span><span class="mbin">−</span><span class="mspace" style="margin-right:0.2222em;"></span></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">+</span><span class="mclose">]?</span><span class="mopen">(((</span></span><span class="mspace newline"></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">d</span><span class="mord">+</span><span class="mclose">)</span></span><span class="mspace newline"></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord">.</span><span class="mclose">?</span><span class="mopen">(</span></span><span class="mspace newline"></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">d</span><span class="mord">+</span><span class="mclose">)?)</span><span class="mord">∣</span></span><span class="mspace newline"></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:0.1056em;"></span><span class="mord">.</span></span><span class="mspace newline"></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">d</span><span class="mord">+</span><span class="mclose">)</span><span class="mopen">([</span><span class="mord mathnormal">e</span><span class="mord mathnormal" style="margin-right:0.05764em;">E</span><span class="mclose">]?</span><span class="mopen">[</span><span class="mord">+</span><span class="mord">−</span><span class="mclose">]?</span></span><span class="mspace newline"></span><span class="mspace newline"></span><span class="base"><span class="strut" style="height:1em;vertical-align:-0.25em;"></span><span class="mord mathnormal">d</span><span class="mord">+</span><span class="mclose">)?</span></span></span></span>/';
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'