PHP Conference Japan 2024

is_numeric

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

is_numeric 判斷變數是否為數字或數字字串

說明

is_numeric(mixed $value): bool

判斷給定的變數是否為數字或數字字串

參數

value

要評估的變數。

回傳值

如果 value 是數字或數字字串,則返回 true,否則返回 false

更新日誌

版本 說明
8.0.0 以空格結尾的數字字串("42 ")現在將返回 true。以前,會返回 false

範例

範例 #1 is_numeric() 範例

<?php
$tests
= array(
"42",
1337,
0x539,
02471,
0b10100111001,
1337e0,
"0x539",
"02471",
"0b10100111001",
"1337e0",
"not numeric",
array(),
9.1,
null,
'',
);

foreach (
$tests as $element) {
if (
is_numeric($element)) {
echo
var_export($element, true) . " 是數值", PHP_EOL;
} else {
echo
var_export($element, true) . " 不是數值", PHP_EOL;
}
}
?>

上述範例將輸出:

'42' is numeric
1337 is numeric
1337 is numeric
1337 is numeric
1337 is numeric
1337.0 is numeric
'0x539' is NOT numeric
'02471' is numeric
'0b10100111001' is NOT numeric
'1337e0' is numeric
'not numeric' is NOT numeric
array (
) is NOT numeric
9.1 is numeric
NULL is NOT numeric
'' is NOT numeric

範例 #2 is_numeric() 搭配空白字元

<?php
$tests
= [
" 42",
"42 ",
"\u{A0}9001", // 不斷行空格
"9001\u{A0}", // 不斷行空格
];

foreach (
$tests as $element) {
if (
is_numeric($element)) {
echo
var_export($element, true) . " 是數值", PHP_EOL;
} else {
echo
var_export($element, true) . " 不是數值", PHP_EOL;
}
}
?>

上述範例在 PHP 8 中的輸出:

' 42' is numeric
'42 ' is numeric
' 9001' is NOT numeric
'9001 ' is NOT numeric

上述範例在 PHP 7 中的輸出:

' 42' is numeric
'42 ' is NOT numeric
' 9001' is NOT numeric
'9001 ' is NOT numeric

參見:

新增註解

使用者貢獻的註解 7 則註解

sobolanx at gmail dot com
13 年前
請注意,此函式接受極大的數字並能正確地評估它們。

例如:

<?php
$v
= is_numeric ('58635272821786587286382824657568871098287278276543219876543') ? true : false;

var_dump ($v);
?>

上述程式碼將輸出

bool(true)

因此,這個函式不會被超大數字嚇倒。我希望這對某些人有所幫助。

備註:還要請注意,如果您寫 is_numeric (45thg),這將會產生一個解析錯誤(因為參數沒有用單引號或雙引號括起來)。使用此函式時請記住這一點。
tanguy_barsik at hotmail dot com
7 年前
對於字串,只有在浮點數有小數點時才會返回 true

is_numeric( '42.1' )//true
is_numeric( '42,1' )//false
moskalyuk at gmail dot com
18 年前
is_numeric 對於大於 LONG_MAX 的十六進位值會失敗,因此即使該值是有效的十六進位數,將其透過 is_numeric 解析也會返回 FALSE。
ben at chico dot com
10 年前
顯然 NAN(非數字)對於 is_numeric() 來說是一個數字。

<?php
echo "是 ";
if (!
is_numeric(NAN))
echo
"不是 ";
echo
"數字";
?>

輸出「是數字」。所以一個「不是」數字(根據定義)的東西卻是數字…
kouber at saparev dot com
21 年前
請注意,此函數不適用於檢查非常長的字串是否為「數值」。實際上,傳遞給此函數的所有內容都會先轉換為 long,然後再轉換為 double。任何大於約 1.8e308 的值對於 double 來說都太大,因此它會變成無限大,即 FALSE。這意味著,對於每個超過 308 個字元的字串,即使所有字元都是數字,is_numeric() 也會返回 FALSE。

然而,這種行為取決於平台。

https://php.dev.org.tw/manual/en/language.types.float.php

在這種情況下,適合使用正規表達式

function is_numeric_big($s=0) {
return preg_match('/^-?\d+$/', $s);
}
Magnus Deininger, dma05 at web dot de
15 年前
關於全球與美式數字表示法,應該注意的是,至少在日語中,數字不是每三位數用一個額外符號分組,而是每四位數分組一次(例如 1,0000 而不是 10.000)。此外,nadim 的正規表達式在一點上略有不佳,有一個未轉義的 '.' 運算符,而且整個事情可以很容易地組合成一個正規表達式(速度等等)。

調整

<?php
$eng_or_world
= preg_match
('/^[+-]?'. // 開頭標記和正負號前綴
'(((([0-9]+)|([0-9]{1,4}(,[0-9]{3,4})+)))?(\\.[0-9])?([0-9]*)|'. // 美式
'((([0-9]+)|([0-9]{1,4}(\\.[0-9]{3,4})+)))?(,[0-9])?([0-9]*))'. // 全球
'(e[0-9]+)?'. // 指數
'$/', // 結束標記
$str) == 1;
?>

我確定這仍然不是最佳的,但它也應該涵蓋日式數字,並且修復了其他正規表達式的一些其他問題。它還允許使用指數後綴,小數點前的數字是可選的,並且它強制使用分組或未分組的整數部分。也應該更容易根據您的喜好進行調整。
Katrina Kizenbach
1 年前
請注意,對於使用小數點逗號的數字字串,is_numeric() 的評估結果將為 false。

is_numeric('0.11');
輸出:true

is_numeric('0,11');
輸出:false
To Top