Delicious Bookmark this on Delicious Share on Facebook SlashdotSlashdot It! Digg! Digg



PHP : Function Reference : Character Type Functions : ctype_digit

ctype_digit

Check for numeric character(s) (PHP 4 >= 4.0.4, PHP 5)
bool ctype_digit ( string text )

Example 419. A ctype_digit() example

<?php
$strings
= array('1820.20', '10002', 'wsl!12');
foreach (
$strings as $testcase) {
   if (
ctype_digit($testcase)) {
       echo
"The string $testcase consists of all digits.\n";
   } else {
       echo
"The string $testcase does not consist of all digits.\n";
   }
}
?>

The above example will output:

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.

Code Examples / Notes » ctype_digit

15-may-2007 08:31

You have your if() statement backwards. It's returning "This does not consist of only digits." when cytype_digit($var) is true.
<?php
$var = 5;
if (cytype_digit($var))
{
   echo "This does not consist of only digits.";
}
else
{
   echo "This cosists of only digits.";
}
?>


robert

withheld at withheld dot com:
it is called : 'User Contributed Notes' not 'Bugs' so I am not saying there is something wrong with the function at all.
It is used for tips, tricks and simple mistakes people could make using the function. I just noted something just like that, nothing wrong with that.


shivanfalcon

This function also seems to give a false for integers (PHP 4.4.4)
<?php
$var = 5;
if (cytype_digit($var))
{
   echo "This does not consist of only digits.";
}
else
{
   echo "This cosists of only digits.";
}
?>
Returns "This does not consist of only digits.".
I can only assume that this is because of how integers are seen.
2 = 00000010 bitwise
bitwise, 00000010 happens to be some ASCII formatting character, which isn't a digit.


withheld

robert at mediamonks dot com writes...
04-Jun-2007 11:46
I always used this function to check user input but it failed me when I wanted to check int's used in my script. This is caused by the fact that the function only functions right when the argument is a string. Here is a solution for this 'problem' :
Could we have some accuracy in these comments please? If the spec at the top of this page is taken to be correct then Robert is incorrect as it clearly states that the argument should be a string. Skimming notes in this section suggests to the reader that there is a problem with this function when actually people just arent reading the documentation - proliferation of careless mistakes.


reuvenab

Just be aware that
ctype_digit('') == 1


minterior

I use ctype_digit() function as a part of this IMEI validation function.
<?php
/**
* Check the IMEI of a mobile phone
* @param $imei IMEI to validate
*/
function is_IMEI_valid($imei){    
   if(!ctype_digit($imei)) return false;
   $len = strlen($imei);
   if($len != 15) return false;
   for($ii=1, $sum=0 ; $ii < $len ; $ii++){
       if($ii % 2 == 0) $prod = 2;
       else $prod = 1;
       $num = $prod * $imei[$ii-1];
       if($num > 9){
         $numstr = strval($num);
         $sum += $numstr[0] + $numstr[1];
       }else $sum += $num;
   }
   $sumlast = intval(10*(($sum/10)-floor($sum/10))); //The last digit of $sum
   $dif = (10-$sumlast);
   $diflast = intval(10*(($dif/10)-floor($dif/10))); //The last digit of $dif
   $CD = intval($imei[$len-1]); //check digit
   if($diflast == $CD) return true;
   return false;
}
?>


robert

I always used this function to check user input but it failed me when I wanted to check int's used in my script. This is caused by the fact that the function only functions right when the argument is a string. Here is a solution for this 'problem' :
<?php
$intCheckThis = 99;
$blnResult = ctype_digit($intCheckThis); // returns FALSE
$blnResult = ctype_digit(strval($intCheckThis)); // returns TRUE
?>
Note that user input from form or request uri is always handled as string anyway.


jengelh@

ctype_digit("") returns false in PHP5.

ipernet

Be careful !
ctype_digit(36) === false because 36 is type INT and ctype_digit take only string
ctype_digit('36') === true


justinb

@robert at mediamonks dot com & withheld at withheld dot com:
I personally believe more in solutions than problems.  If you're concerned about the possibility of an int type variable being passed to ctype_digit()--and don't want to add another conditional statement using is_int() to avoid the problem--there's another simple solution: typecast it.
<?php
// The Problem
$test_values = array(123,'456','7eight9');
foreach($test_values as $test) {
   if(ctype_digit($test)) echo 'True' . "\n";
   else echo 'False' . "\n";
}
// OUTPUT: False, True, False
// An Easy Solution
$test_values = array(123,'456','7eight9');
foreach($test_values as $test) {
   if(ctype_digit((string)$test)) echo 'True' . "\n";
   else echo 'False' . "\n";
}
// OUTPUT: True, True, False
?>


Change Language


Follow Navioo On Twitter
ctype_alnum
ctype_alpha
ctype_cntrl
ctype_digit
ctype_graph
ctype_lower
ctype_print
ctype_punct
ctype_space
ctype_upper
ctype_xdigit
eXTReMe Tracker