Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP检查字符串是否包含数字并检查字符串长度_Php_Numeric - Fatal编程技术网

PHP检查字符串是否包含数字并检查字符串长度

PHP检查字符串是否包含数字并检查字符串长度,php,numeric,Php,Numeric,我试图检查用户名字符串是否都是数字(但字段不是数字字段)。如果是这样,我需要通过添加前导0使字符串长度为5个字符 我有以下代码: <?php $getuname = $_GET['un']; if (mb_strlen($getuname) <= 1){ $getuname = "0".$getuname; } if (mb_strlen($getuname) <= 2){ $getuname = "0".$getuname;

我试图检查用户名字符串是否都是数字(但字段不是数字字段)。如果是这样,我需要通过添加前导0使字符串长度为5个字符

我有以下代码:

<?php
$getuname = $_GET['un'];

if (mb_strlen($getuname) <= 1){
        $getuname = "0".$getuname;
    }
if (mb_strlen($getuname) <= 2){
        $getuname = "0".$getuname;
    }
if (mb_strlen($getuname) <= 3){
        $getuname = "0".$getuname;
    }
if (mb_strlen($getuname) <= 4){
        $getuname = "0".$getuname;
    }   
echo $getuname;
?>

上面的代码通过添加零来确保字符串是5个字符,但它不是很漂亮,我相信有一种更好的方法可以做到这一点。有人吗

此外,这整段代码需要包装在一个IF语句中,该语句首先检查它是否只包含数字。我试过用!是数字,但这似乎不起作用。我之所以这样假设是因为它不是一个数字类型的字段。

使用该函数。像这样:

$getuname = str_pad($_GET['un'], 5, '0', STR_PAD_LEFT);

这应该是一种干净的解决方案:

$getuname = $_GET['un'];
if(preg_match('/^\d+$/',$getuname)){
    echo sprintf('%05d', $getuname);
}else{
    // incorrect format
}

可以使用
is\u numeric
检查数值字段,不管变量是否为字符串

然后,您只需使用
str\u pad()

编辑:正如flixer指出的那样,
是数值的()
实际上不会执行您特别要求的操作(检查字符串是否只包含数字,即不包含句点、逗号、破折号等被视为“数字”)。在这种情况下,请改用
ctype\u digit()

$test_number = '123.4';
$test_number2 = '12345';

echo ctype_digit($test_number) ? $test_number . ' is only digits' : $test_number . ' is not only digits';
echo ctype_digit($test_number2) ? $test_number2 . ' is only digits' : $test_number2 . ' is not only digits';

// output:
// 123.4 is not only digits
// 12345 is only digits
这里的关键是

另外,当您传入一个整数变量时,
ctype\u digit()
可能返回false(《PHP手册》中的示例)

这是可以的,这取决于您使用它的情况。在您的例子中,您正在验证一个
$\u GET
变量,该变量总是一个字符串,因此不会影响您

文档:

  • str\u pad()
  • ctype\u digit()
在这里,这就是全部。工作起来很有魅力

   if (ctype_digit($getuname) == true) {
    $getuname = str_pad($getuname, 5, 0, STR_PAD_LEFT);
    }
试试这个:

<?php
$getuname = $_GET['un'];
if(ctype_digit($getuname))
     $getuname = str_repeat("0", 5-strlen($getuname)) . $getuname;
?>


希望它对你有用

使用
preg_-match
检查用户名是否只包含数字tas9是否完全正确,preg_-match是检查这一点的最佳解决方案。在这种情况下,is_int和is_numeric不可靠。仅供参考:对于超过100万次的速度测试,
ctype_digit
需要0.114777s,正则表达式解决方案需要0.783449sNo无需在此处使用正则表达式。为什么不?检查“我正在尝试检查用户名字符串是否都是数字”的首选解决方案是什么?检查字符串是否只包含数字不是一个好的解决方案,因为它会在“5.1”、“3”和“1e7”等情况下返回true
ctype_digit( '42' ); // true
ctype_digit( 42 ); // false - ASCII 42 is the * symbol
   if (ctype_digit($getuname) == true) {
    $getuname = str_pad($getuname, 5, 0, STR_PAD_LEFT);
    }
<?php
$getuname = $_GET['un'];
if(ctype_digit($getuname))
     $getuname = str_repeat("0", 5-strlen($getuname)) . $getuname;
?>