2012-11-24 37 views
3

以下代碼成功驗證字符串「0123.250」是否爲有效的float,如果不是。這是一個PHP錯誤還是我做錯了什麼?PHP filter_var bug?

filter_var('0123.250', FILTER_VALIDATE_FLOAT); 
+0

'floatval'也將其解析爲浮點數'123.25'。你是否期望前導零是無效的? – DCoder

+2

爲什麼這是一個無效的浮點數? –

+1

看起來像一個漂浮在我身邊... – MrCode

回答

3

PHP documentation on float literals

LNUM   [0-9]+ 
DNUM   ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*) 
EXPONENT_DNUM [+-]?(({LNUM} | {DNUM}) [eE][+-]? {LNUM}) 

正如你所看到的,是前導零沒有限制,通過這些位指示:[0-9]*[\.][0-9]+

由於頁面從來沒有提到過八進制,所以我們需要假設前導零在解釋上沒有差別。

I 假設確切的規則適用於FILTER_VALIDATE_FLOAT

+0

我認爲OP是指字符串'0123.250'不是浮動的事實。我跑了var_dump(is_float('0123.250'));並且返回值是bool(false)。但是,當我運行var_dump(is_float(0123.250))時,返回值爲bool(true)。 – awm

+0

@Ali'is_float'檢查變量的類型。 ''0123.250''不是以同樣的方式浮動''hello kitty'不是浮動。從評論中,您可以看到OP在擔心引導零。 – phant0m

+0

但我期望'filter_var('0123.250',FILTER_VALIDATE_FLOAT);'就像'filter_var('hello_kitty',FILTER_VALIDATE_FLOAT);'是假的。基本上,爲什麼PHP在數字而不是字符串中做出「0123.250」的假設? – awm

1

前導0只是說明了千位的值爲零的事實,這通常是由於該位置值沒有數字而暗示的事實。

如果您擔心前導零是非重要數字這一事實,我不認爲PHP嚴格遵循這個定義。