[PHP]数値、整数値、小数の値かをチェックする

Read More



PHPで数値を判定する関数を以前の記事で書いたが、
処理が甘く抜けてしまうパターンがあることが判明した。
・以前の記事
http://xirasaya.com/?m=detail&hid=478


ということで手直しをしてみた。
■整数値・小数値の判定
<?php
/**
 * 整数値・小数値の有効判定
 * ****************************************40
 * nullや''(空文字)はfalseとなる。
 * 
 * 002 - 第2引数で小数点桁数を指定できるよう修正
 * 
 * @param variant $var=null
 * @param integer|null $deci=null	// null: 小数桁無限、0: 小数不可(整数のみ)、1: 小数桁1位まで許可、2: 小数桁2位まで許可
 * @return boolean
 */
function is_real_num($var=null, $deci=null)
{
  $chk=true;
  if($chk) $chk = is_numeric($var);
  if($chk)
    {
      if($deci===0 or $deci==='0')
      {
        if($chk) $chk = preg_match('/^(0|-?[1-9][0-9]*)$/u', $var);
      }
      else
      {
        $range = '+';
        if($deci>=1) $range = "{1,$deci}";
        if($chk) $chk = preg_match('/^(0|-?[1-9][0-9]*|-?(0|[1-9][0-9]*)\.[0-9]'.$range.')$/u', $var);
      }
  }
//    if($chk) $chk = !preg_match('/^(-0|-0\.[0]+)$/u', $var);    // allow 0.0{n}
        if($chk) $chk = !preg_match('/^(-0|-?0\.[0]+)$/u', $var);    // not allow 0.0{n}
  
  return (boolean)$chk;
}

$var = 1234.5678;
$chk = is_real_num($var);
echo $chk;
?>

注)
前回の記事では「実数」と表記していたがそれだと意味が違ってくるという指摘を受けたので、
今回は正しくわかるように「整数値・小数値の判定」のみとした。


■実行結果
> 1




今回の手直し修正に加えて第2引数を指定できるよう改良した。
これにより整数値のみを許可したい場合や、小数点の第何位までなら許可する、といった使い方が可能になった。

第2引数の挙動は具体的には以下の通り。
・第2引数を何も指定しなかった場合は整数値と小数値の両方が通る。
・第2引数に0を指定した場合は整数値のみ通る。
・第2引数に1を指定した場合は小数第1位までの値なら通る。
・第2引数に2を指定した場合は小数第2位までの値が通る。




今回は前回よりテストパターンを少し増やしてみた。
echoecho(is_real_num('1'));     // 1
echoecho(is_real_num('2'));     // 1
echoecho(is_real_num('10'));    // 1
echoecho(is_real_num('100'));  // 1
echoecho(is_real_num('999'));  // 1
echoecho(is_real_num('0'));     // 1
echoecho(is_real_num('-1'));   // 1
echoecho(is_real_num('-2'));   // 1
echoecho(is_real_num('-10'));  // 1
echoecho(is_real_num('-100'));  // 1
echoecho(is_real_num('-999'));  // 1
echoecho(is_real_num('0.1'));    // 1
echoecho(is_real_num('0.10'));   // 1
echoecho(is_real_num('0.11'));   // 1
echoecho(is_real_num('1.0'));   // 1
echoecho(is_real_num('1.1'));   // 1
echoecho(is_real_num('1.11'));   // 1
echoecho(is_real_num('11.0'));   // 1
echoecho(is_real_num('11.10'));   // 1
echoecho(is_real_num('-0.1'));   // 1
echoecho(is_real_num('-0.10'));   // 1
echoecho(is_real_num('-0.11'));   // 1
echoecho(is_real_num('-1.0'));   // 1
echoecho(is_real_num('-1.1'));   // 1
echoecho(is_real_num('-1.11'));   // 1
echoecho(is_real_num('-11.0'));   // 1
echoecho(is_real_num('-11.10'));   // 1
echoecho(is_real_num('0.0'));   // 0
echoecho(is_real_num('-0.0'));   // 0
echoecho(is_real_num('a'));   // 0
echoecho(is_real_num('abc'));   // 0
echoecho(is_real_num('-0'));   // 0
echoecho(is_real_num('00'));   // 0
echoecho(is_real_num('001'));   // 0
echoecho(is_real_num('-00'));   // 0
echoecho(is_real_num('-001'));   // 0
echoecho(is_real_num('--1'));    // 0
echoecho(is_real_num('--0.1'));   // 0
echoecho(is_real_num('00.0'));   // 0
echoecho(is_real_num('00.1'));   // 0
echoecho(is_real_num('0.00'));   // 0
echoecho(is_real_num('0_10'));   // 0
echoecho(is_real_num(null));   // 0
echoecho(is_real_num(''));   // 0
※echoecho()は自作関数
※戻り値はbooleanだがここでは視覚的にわかりやすくするため0と1で表記




うん、いいんじゃないでしょうか