PHP Conference Japan 2024

ctype_digit

(PHP 4 >= 4.0.4, PHP 5, PHP 7, PHP 8)

ctype_digit检查字符是否为数字

描述

ctype_digit(混合 $text): 布尔型

检查提供的 字符串 text 中的所有字符是否都是数字。

参数

text

要测试的字符串。

注意:

如果提供了一个介于 -128 和 255(含)之间的 整数,则将其解释为单个字符的 ASCII 值(负值加上 256 以允许扩展 ASCII 范围内的字符)。任何其他整数都被解释为包含整数十进制数字的字符串。

警告

从 PHP 8.1.0 开始,传递非字符串参数已弃用。将来,该参数将被解释为字符串而不是 ASCII 代码点。根据预期的行为,该参数应该要么转换为 字符串,要么应该显式调用 chr()

返回值

如果字符串 text 中的每个字符都是十进制数字,则返回 true,否则返回 false。当使用空字符串调用时,结果将始终为 false

示例

示例 #1 ctype_digit() 示例

<?php
$strings
= array('1820.20', '10002', 'wsl!12');
foreach (
$strings as $testcase) {
if (
ctype_digit($testcase)) {
echo
"字符串 $testcase 由所有数字组成。\n";
} else {
echo
"字符串 $testcase 不由所有数字组成。\n";
}
}
?>

以上示例将输出

The string 1820.20 does not consist of all digits.
The string 10002 consists of all digits.
The string wsl!12 does not consist of all digits.

示例 #2 ctype_digit() 示例,比较字符串和整数

<?php

$numeric_string
= '42';
$integer = 42;

ctype_digit($numeric_string); // true
ctype_digit($integer); // false (ASCII 42 是 * 字符)

is_numeric($numeric_string); // true
is_numeric($integer); // true
?>

参见

添加注释

用户贡献的注释 13 条注释

info at directwebsolutions dot nl
12 年前
我尝试的所有基本 PHP 函数都返回了意外的结果。我只是想检查某个变量是否仅包含数字。例如:当我在公共场合发布我的脚本时,我不能要求用户只使用数字作为字符串或整数。对于这些情况,我编写了自己的函数来处理其他函数的所有不便之处,并且不依赖于正则表达式。有些人坚信正则函数会降低脚本的速度。

编写此函数的原因
1. is_numeric() 接受像 +0123.45e6 这样的值(但您期望它不会)
2. is_int() 不接受 HTML 表单字段(如:123),因为它们被视为字符串(如:"123")。
3. ctype_digit() 期望所有数字都是字符串(如:"123"),并且不验证真正的整数(如:123)。
4. 可能某些函数会将布尔值(如:true 或 false)解析为 0 或 1 并以这种方式进行验证。

我的函数仅接受数字,无论它们是字符串格式还是整数格式。
<?php
/**
* 检查输入是否仅包含数字
* @author Tim Boormans <[email protected]>
* @param $digit
* @return bool
*/
function is_digit($digit) {
if(
is_int($digit)) {
return
true;
} elseif(
is_string($digit)) {
return
ctype_digit($digit);
} else {
// 布尔值、浮点数和其他
return false;
}
}
?>
smicheal2 at gmail dot com
9 年前
请注意,ctype_digit() 会对像 '00001' 这样的字符串返回 true,这些字符串在技术上不是整数的有效表示形式,而对像 '-1' 这样的字符串返回 false。它基本上是正则表达式 /^\d+$/ 的更快版本。顾名思义,它字面回答了“此字符串是否仅包含数字”的问题。它不回答“这是否为整数的有效表示形式”。如果这就是您想要的,请改用 is_int(filter_var($val, FILTER_VALIDATE_INT))。
Peter de Pijd
15 年前
请注意,空字符串也为 false
ctype_digit("") // false
error17191 at gmail dot com
9 年前
我只是想澄清“info at directwebsolutions dot nl”建议的函数 is_digit() 中的一个缺陷。
它在负整数的情况下返回 true,在包含负整数的字符串的情况下返回 false。
示例
is_digit(-10); // 返回 true
is_digit('-10'); // 返回 false
rlerne at gmail dot com
11 年前
值得注意的是,您必须将字符串传递给此函数,其他值不会被类型转换(我以为即使上面明确说明了字符串 $text)。

例如

<?PHP
$val
= 42; // 生命的答案
$x = ctype_digit($val);
?>

将返回 false,即使在类型转换为字符串后,它也为 true。

<?PHP
$val
= '42';
$x = ctype_digit($val);
?>

返回 True。

也可以这样做

<?PHP
$val
= 42;
$x = ctype_digit((string) $val);
?>

这也会返回 true,正如预期的那样。
strrev xc tod noxeh ta ellij
14 年前
ctype_digit() 会将所有传递的低于 256 的整数视为字符代码。它对 48 到 57(ASCII '0'-'9')返回 true,对其余返回 false。

ctype_digit(5) -> false
ctype_digit(48) -> true
ctype_digit(255) -> false
ctype_digit(256) -> true

(注意:PHP 类型必须是 int;如果传递字符串,则按预期工作)
a_p_leeming at hotmail dot com
15 年前
另请注意

<?php ctype_digit("-1"); //false ?>
mdsky at web dot de
14 年前
is_numeric 例如对 1e3 或 0xf5 也返回 true。因此它与 ctype_digit 不同,ctype_digit 仅在输入 0 到 9 的值时返回 true。
John Saman
14 年前
使用 is_numeric 函数比 ctype_digit 快得多。

is_numeric 运行一百万次用了 0.237 秒,而 ctype_digit 用了 0.470 秒。
zorrosNOSPAMwordsman at NOSPAM dot gmail dot com
8 年前
如果要验证变量是否仅包含数字,可以将其类型转换为字符串再转换回整数,然后查看结果是否相同。如下所示

<?php

// (bool) TRUE 如果仅为数字,否则为 FALSE
$isOnlyDigits = (string) (int) $input === (string) $input;

?>

我还没有对其进行基准测试,但我猜测它比正则表达式快得多。
raul dot 3k at gmail dot com
15 年前
ctype_digit 可以以简单的形式用于验证字段
<?php
$field
= $_POST["field"];
if(!
ctype_digit($field)){
echo
"它不是数字";
}
?>

注意
数字是 0-9
brcontainer at yahoo dot com dot br
6 年前
ctype_digit 不支持字符串中的负值

<?php
var_dump
( ctype_digit('-10') ); //return bool(false)
?>

改进(并简化)了 Tim Boormans 的代码

<?php
/**
* 检查输入是否仅包含数字
* @author Guilherme Nascimento <[email protected]>
* @param $digit
* @return bool
*/
function is_digit($digit)
{
return
preg_match('#^-?\d+$#', $digit) && is_int((int) $digit);
}
divinity76 at gmail dot com
3 年前
如果您想检查它是否为有效的整数,则可以使用以下替代方法

<?php
if(false!==filter_var($v, FILTER_VALIDATE_INT)){
// 它是一个有效的整数!
$v=(int)$v;
}else{
// 它不是一个有效的整数
}
?>

或者,如果您想检查它是否为正整数(>= 0)
<?php
if(false!==filter_var($v, FILTER_VALIDATE_INT, ["options"=>["min_range"=>0]])){
// 它是一个有效的正整数!
$v = (int)$v;
}else{
// 它不是一个有效的正整数
}

?>
To Top