2010-07-31 136 views
32

你知道一个函数可以检查一个字符串是否包含一个整数吗?检查一个字符串是否包含整数

以下是我希望它的工作:

holds_int("23") // should return true. 
holds_int("2.3") // should return false. 
holds_int("qwe") // should return false. 
+1

*(相关)* [检查该字符串是否是Unix时间戳(http://stackoverflow.com/questions/2524680/check-whether-the-string-is-a-unix-timestamp/2524761# 2524761) - 测试基本相同 – Gordon 2010-07-31 09:44:14

+0

为什么你需要? – mathk 2010-07-31 09:45:51

+0

@mathk:我需要验证用户输入。 – 2010-07-31 10:14:03

回答

60
if((string)(int)$var == $var) { 
    echo 'var is an integer or a string representation of an integer'; 
} 

示例结果:

var_dump(test(1)   ); // TRUE 
var_dump(test('1')   ); // TRUE 
var_dump(test('1.0')  ); // TRUE 
var_dump(test('1.1')  ); // false 
var_dump(test('0xFF')  ); // false 
var_dump(test('0123')  ); // TRUE 
var_dump(test('01090')  ); // TRUE 
var_dump(test('-1000000') ); // TRUE 
var_dump(test('+1000000') ); // TRUE 
var_dump(test('2147483648') ); // false 
var_dump(test('-2147483649')); // false 

见下面戈登的答案如何做到这一点的表现不同,如果===用于比较而不是==

+3

这应该用'==='测试并确保数字在整数范围内 – Gordon 2010-07-31 09:50:33

+6

===如果$ var实际上不起作用是一个整数。 ==会不管它是一个字符串还是一个int。 OP没有特别要求,但如果它实际上是一个整数,返回false似乎有点不正确。 – Jhong 2010-07-31 09:55:19

+0

对于PHP_INT_MAX的附加检查也没有意义 - 如果整数超出范围,上面将返回false。为什么添加额外支票? – Jhong 2010-07-31 09:57:49

4

其他选项

function holds_int($str) 
    { 
    return preg_match("/^-?[0-9]+$/", $str); 
    } 
+0

这(目前的形式)也没有考虑负整数。 – VolkerK 2010-07-31 09:42:56

+0

@ VolkerK:我正在编辑它,现在它 – nico 2010-07-31 09:43:30

+0

为什么downvote?这正是OP要求的。 – nico 2010-07-31 09:44:47

1

可能有两个情况下─

  1. 您需要检查一些确切的字符串格式(ANS大部分是这一个)

  2. 你想检查一个字符串是否包含特定的数字

    preg_match('/'.$matching_number.'/',$container_string);

9

不想无意中把Jhong的回答为CW,所以对于===而不是==测试的时候,这里记录的是结果。

function test($var) { 
    return ((string)(int)$var === $var); 
} 

var_dump(test(1)   ); // returns false vs TRUE 
var_dump(test('1')   ); // returns TRUE 
var_dump(test('1.0')  ); // returns false vs TRUE 
var_dump(test('1.1')  ); // returns false 
var_dump(test('0xFF')  ); // returns false 
var_dump(test('0123')  ); // returns false vs TRUE 
var_dump(test('-0123')  ); // returns false vs TRUE 
var_dump(test('-1000000') ); // returns TRUE 
var_dump(test('+1000000') ); // returns false vs TRUE 
var_dump(test('2147483648') ); // returns false 
var_dump(test('-2147483649')); // returns false 
+1

1.0(float)和0123(invalid)在这里比我的版本更好 - 我没有考虑过它们! – Jhong 2010-07-31 16:01:21

+0

@Jhong使用'=='也会为十六进制'0xFF'和科学记数'-1.3e3'返回true(例如,当不用作字符串时,如果用作字符串,则为false) – Gordon 2010-07-31 16:16:25

1

comparison.php:

<?php 
function is_numeric_int($s) 
{ 
    return (strval(intval($s)) === $s); 
} 

function print_ini($s) 
{ 
    echo "$s: " . (is_numeric_int($s) ? 'true' : 'false') . "\n"; 
} 

print_ini('qwe'); 
print_ini('23'); 
print_ini('-23'); 
print_ini('23.0'); 
print_ini('-23.0'); 
?> 

试运行:

$ php comparison.php 
qwe: false 
23: true 
-23: true 
23.0: false 
-23.0: false 
-3

is_int是唯一的它的意思做这项工作。

+0

'is_int'确定是否_type_变量是一个整数,而不是_value_。 – Josh 2017-03-12 19:29:33

8

更新自PHP 7.1有使用is_int()与非数值,如在本讨论SO Answer问题。在任何情况下,这是一个非常古老的答案,我真的认为这是在这一点所以因人而异一个黑客攻击的东西;)

很抱歉,如果这个问题已经回答了,但这已经在为我工作过去:

首先检查字符串是否为is_numeric。如果是将0添加到值以使PHP将字符串转换为相关类型。然后你可以检查它是否与is_int一致。快速和肮脏的,但它为我的作品...

$values = array(1, '2', '2.5', 'foo', '0xFF', 0xCC, 0644, '0777'); 

foreach ($values as $value) { 
    $result = is_numeric($value) && is_int(($value + 0)) ? 'true' : 'false'; 
    echo $value . ': ' . $result . '<br />'; 
} 

结果:

1: true 
2: true 
2.5: false 
foo: false 
0xFF: true 
204: true 
420: true 
0777: true 

唯一的问题是,它会从字面上评估包裹在一个八进制的字符串值,即:“0123”也根本成为123。但是,这是很容易解决:)

+1

当某个值实际上不是一个数字时,例如'foo',我得到以下* PHP错误*:'遇到了一个非数字值。我正在使用'PHP 7.1.3'。 [与此相关的答案](http://stackoverflow.com/a/42044413/1883256)。 [他们建议不要在这里使用is_int()](https://odd.blog/2009/03/31/php-is_numeric-vs-is_int/) – Pathros 2017-05-14 16:29:08

+0

感谢您的评论@Pathros - 正如你所看到的,这是一个7岁的答案,所以它看起来像自PHP 7.1以来的行为有所改变。我将编辑我的答案以记录更改。 – 2017-05-14 16:43:56

11

不是最快的方法,但filter_var()是相当准确:

function test($s) 
{ 
    return filter_var($s, FILTER_VALIDATE_INT) !== false; 
} 

下面是基于Jhong的answer结果,标有!!差异:

var_dump(test(1)   ); // true 
var_dump(test('1')   ); // true 
var_dump(test('1.0')  ); // false !! 
var_dump(test('1.1')  ); // false 
var_dump(test('0xFF')  ); // false 
var_dump(test('0123')  ); // false !! 
var_dump(test('01090')  ); // false !! 
var_dump(test('-1000000') ); // true 
var_dump(test('+1000000') ); // true 
var_dump(test('2147483648')); // true !! on 64bit 
var_dump(test('-2147483649')); // true !! on 64bit 

允许八进制整数:

function test($s) 
{ 
    return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_OCTAL) !== false; 
} 

个结果:

var_dump(test('0123')); // true 
var_dump(test('01090')); // false !! 

要允许十六进制表示:

function test($s) 
{ 
    return filter_var($s, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX) !== false; 
} 

结果:

var_dump(test('0xFF')); // true !! 
+0

我刚使用你的功能,它有大量的问题。鉴于要求检查一个字符串是否包含一个整数,但没有说明可以存在多长时间,我认为在这种情况下,正则表达式方法可能会更好。 对于像999999999999999999这样的数字,它会起作用,但是如果您尝试使用包含数字9999999999999999999(这是一个有效整数)的字符串,它将会失败。 – 2017-11-26 18:42:23

+0

@JeanPaulRuiz当然,这是一种解释方式,我的方法检查它是否可以分配给一个变量:) – 2017-11-27 23:33:06

4

如果字符串包含空格,然后@杰克的答案将无法提供准确的结果。 例如

$var = '19 '; 
if((string)(int)$var == $var) { 
echo 'var is an integer or a string representation of an integer'; 
} 

根据上面的检查,上面的字符串不会是int。的

因此而不是使用此,请尝试以下操作:

if(ctype_digit(trim('19 '))){ 
    echo 'it is digit '; 
}else{ 
    echo 'it is not digit '; 
} 
+0

实际上,我的答案对于“19”产生'true';你必须与Jhong的答案混淆。 – 2014-09-15 10:23:24

2

也许这也将在特定情况下 帮助PHP中的函数已经这样做了,它被称为“is_numeric()来” 它会返回true或accordenly假..

if(is_numeric($somestring) == True){ 
     echo "this string contains a integar"; 
    } 

链接:http://www.php.net/is_numeric

你说 “holdsint(” 2" )应该返回true,以及is_numeric(“2”)返回True和is_numeric(“a”)False,如预期的那样,该函数存在于php中,不需要重写。

+2

这是不正确的;对于浮点数,is_numeric()返回true。 – Tristan 2014-08-27 18:15:08

+0

啊是的,但像这里的大多数事情,在发布时原来的问题是正确的没有提到花车,然后原来的海报去编辑他的问题,所以现在我看起来像白痴。典型。 – scott 2016-11-02 00:31:38

1

我很喜欢nyson的建议,但注意到它对于'0123'将是错误的。 我现在这样做:

(string)(int)$var === ltrim((string)$var, '0') 

(这已张贴作为评论@nyson,但我没有足够的权限,这样做还)。

编辑补充: 如果你想零是真实的,你需要做的是这样

(int)$var === 0 || (string)(int)$var === ltrim((string)$var, '0') 
3

ctype_digit将这样的伎俩:

ctype_digit($str)

  1. $str有是一个字符串
  2. 多余的空格是不允许的
  3. 没有小数点.
0

如果您在您的项目(https://github.com/beberlei/assert)使用断言库,你可以很容易地做到这一点的一条线:

Assertion::integerish($var); 

注:它的情况下,抛出一个异常违反了断言。

相关问题