<?php
$val = '245E1';
var_dump($val); // return string(5) "245E1"
$n = is_numeric($val);
var_dump($n); // return bool(true)
问题:is_numeric返回 TRUE
问题:
如何将$ val视为字符串,而不是数字?
如何禁用指数解释?
答案 0 :(得分:3)
从is_numeric()上的手册中,您会发现有很多字符可以进入:
数字字符串由可选符号,任意数量的数字组成, 可选的小数部分和可选的指数部分。因此+ 0123.45e6 是一个有效的数值。十六进制(例如0xf4c3b00c),二进制(例如, 0b10100111001),也允许使用八进制(例如0777)表示法 没有符号,十进制和指数部分。
如果要检查变量是否为整数类型,可以使用is_int(),对于浮点数,可以使用is_float()。但请注意,例如,使用is_int()
,您的变量实际上必须是整数类型,而不仅仅是数字字符串。您也可以使用ctype_digit(),但是您的变量类型必须是字符串;或者具体而言,不是与ASCII字符ord()
匹配的整数。
最简单的方法是使用if (preg_match('#^\d+(\.\d+)?$#', $str))
来验证您的变量,哪个类型只有数字。 (如果不欢迎可选的小数,请从模式中删除括号中的表达式。)
另一个选项是ctype_digit((string) $str)
并将变量转换为字符串类型以避免ASCII映射与整数类型冲突。如果你有小数点,这不会返回。
100 ctype_digit
个循环:0.0340秒。 100000个preg_match
循环:0.1120秒。如果您只想要数字,请使用ctype_digit
并打算执行此操作很多。除此以外;无论适合你的风格。
答案 1 :(得分:0)
如果您要专门测试它是否确实是整数(不包含指数部分),则可以
$a = '245E1';
$b = '24';
$isNumeric = $a == (int)$a; //false
$isNumeric = $b == (int)$b; //true
$isNumeric = is_int($b) || is_string($b) && ctype_digit($b);
或者通常用于浮点数和其他情况
$a = '245E1';
$b = '2.4';
$isNumeric = (float)$a == $a && strlen($a) == strlen((float)$a); //false
$isNumeric = (float)$b == $b && strlen($b) == strlen((float)$b); //true
答案 2 :(得分:0)
对此我有些挣扎,并想出了一些办法:
function is_really_numeric($string) {
return preg_match('#^(?!0[1-9])\d*\.?(?!\.)\d+$#', $string);
}
实际情况:
<?php
$val = '245E1';
if (preg_match('#^(?!0[1-9])\d*\.?(?!\.)\d+$#', $val)) {
settype($val, 'float');
}
var_dump($val);
?>
这不会将“ 0123”,“ 24e51”,“。”或“ 1.2.3.4”解释为数值。