PHP is_numeric - 当字符串中的Exponent时为false

时间:2015-05-31 12:15:23

标签: php

<?php

$val = '245E1';

var_dump($val); // return string(5) "245E1"

$n = is_numeric($val);
var_dump($n); // return bool(true)

问题:is_numeric返回 TRUE

问题:

  1. 如何将$ val视为字符串,而不是数字?

  2. 如何禁用指数解释?

3 个答案:

答案 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”解释为数值。

https://regex101.com/r/PtPM8l/3