PHP Conference Japan 2024

is_float

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

is_float判斷變數的類型是否為浮點數

說明

is_float(混合型別 $value): 布林值

判斷給定變數的類型是否為浮點數。

注意事項:

要測試變數是否為數字或數值字串(例如表單輸入,它始終是字串),您必須使用 is_numeric()

參數

value

要評估的變數。

回傳值

如果 value浮點數,則返回 true,否則返回 false

範例

範例 #1 is_float() 範例

<?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)); //科學記號表示法
var_dump(is_float(true));
?>

以上範例將輸出:

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

另請參閱

新增註記

使用者貢獻的註記 6 則註記

21
nonzer0value
9 年前
將值強制轉換為浮點數,然後再轉換回字串是一個巧妙的技巧。您也可以直接在您要檢查的任何值加上一個字面值 0。

<?php
function isfloat($value) {
// PHP 會自動嘗試將 $value 強制轉換為數字
return is_float($value + 0);
}
?>

看起來運作正常

<?php
isfloat
("5.0" + 0); // true
isfloat("5.0"); // false
isfloat(5 + 0); // false
isfloat(5.0 + 0); // false
isfloat('a' + 0); // false
?>

結果可能依情況而異 (YMMV)
21
Boylett
16 年前
如果你想測試一個字串是否包含浮點數,而不是一個變數是否為浮點數,你可以使用這個簡單的小函式:

function isfloat($f) return ($f == (string)(float)$f);
4
匿名
3 年前
is_float() 會對 NAN、INF 和 -INF 返回 true。您可能需要測試 is_float($value) && is_finite($value),或者使用 filter_var($value, FILTER_VALIDATE_FLOAT) !== false。
7
kshegunov at gmail dot com
16 年前
正如 celelibi at gmail dot com 所說,is_float 只檢查變數的類型,而不檢查它所持有的數據!

如果你想檢查字串是否代表浮點數值,請使用以下正則表達式,而不是 is_float(),
或寫得很差的自定義函式。

/^[+-]?(([0-9]+)|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*)|
(([0-9]+|([0-9]*\.[0-9]+|[0-9]+\.[0-9]*))[eE][+-]?[0-9]+))$/
6
Erutan409 at Hotmail dot com
9 年前
Boylett 的解決方案很簡潔 (https://php.dev.org.tw/manual/en/function.is-float.php#85848),但不適用於長浮點數或非明確「字串」類型的變數,也不適用於用引號括起來的長浮點數,使其成為在轉換為浮點數時會被截斷/捨入的字串。因此,必須完成進一步的邏輯來測試這種情況。以下面的例子來說:

<?php

if (!function_exists("test_float")) {

function
test_float($test) {

if (!
is_scalar($test)) {return false;}

$type = gettype($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));

?>

會產生 (32 位元)

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

到目前為止,一切都還好,對吧?是的,但這會產生誤導,因為字串太長了,當它被轉換成浮點數時,它將不等於被轉換回字串的值的比較。所以前面提到的簡短函式是有效的。看看下一個例子

<?php

$test
= 3.1415926535897932384626433832795;

var_dump($test);
var_dump((float)$test);
var_dump($test == (string)(float)$test);
var_dump(test_float($test));

?>

會產生 (32 位元)

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

為什麼現在它不能正常運作,但值確實是一個浮點數?原因與前面提到的相同。浮點數太長,以至於它被截斷/四捨五入,並且與使用簡寫函數進行的比較不匹配。

所以,如您所見,應該對您正在測試的變數應用更多邏輯。
6
KIVagant at gmail dot com
12 年前
另一個實際應用中的浮點數正規表示式

<?php
function isTrueFloat($val)
{
$pattern = '/^[-+]?(((\\\\d+)\\\\.?(\\\\d+)?)|\\\\.\\\\d+)([eE]?[+-]?\\\\d+)?$/';

return (!
is_bool($val) && (is_float($val) || preg_match($pattern, trim($val))));
}
?>

// 符合的
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'

// 不符合的
false, true, '', '-', '.a', '-1.a', '.a', '.', '-.', '1+', '1.3+', 'a1', 'e.e', '-e-4', 'e2', '8e', '3,25'
To Top