ラベル Validation の投稿を表示しています。 すべての投稿を表示
ラベル Validation の投稿を表示しています。 すべての投稿を表示

2013年3月12日火曜日

Validation その3

今回は数値についてです。これが厄介です。
普通、数値と言いますと自然数を想定してコーディングする方が多いかと思います。
ですが、プログラム上で表現できる数値には様々な種類があります。



  • 符号の有無(+-)
  • 基数の違い(2進数、8進数、10進数、16進数)
  • int型の範囲(32ビット符号付ですと-2147483648~2147483647)を超える数値
  • 浮動小数点
  • 指数表現

これらの値について、使用しても良いかどうかを考慮しつつコーディングをしていかなければなりません。
今回は数値の中でも最も頻繁に使われる形式、Integerについて考えていきましょう。

チェックの手順

1. 引数がint型かどうかを調べる
int型ならreturn

2. int型でなければ次の可能性が上げられる
2.1 float型
2.2 string型の数値文字列
2.3 数値とは全く関係のない値

3. int型にキャストする際に注意すべき点
3.1 int型を超えた値でないか
超えていたらNULLを返す
超えていなければint型にキャストした値を返す

4. 数値とは全く関係ない値の場合
NULLを返す

サンプルコード 実行結果
NULL : NULL
"" : NULL
"a" : NULL
0 : int(0)
1 : int(1)
+1 : int(1)
-1 : int(-1)
0x0A : int(10)
012 : int(10)
0.1 : int(0)
1e3 : int(1000)
1e-3 : int(0)
array("") : NULL
array("a") : NULL
array(array("a")) : NULL
TRUE : NULL
FALSE : NULL
object : NULL
fopen : NULL
成功です。以降、数値のチェックをする際はこの関数を使って入力チェックを行っていきます。

Validation その2

今回は配列の判定です。これも簡単ですね。

取得したい値と弾きたい値の仕様について考えましょう。

取得したい値

  • array
弾きたい値
  • NULL
  • integer
  • float
  • string
  • boolean
  • object
  • resouce

サンプルコード 実行結果
NULL : array(0) {
}
"" : array(0) {
}
"a" : array(0) {
}
0 : array(0) {
}
1 : array(0) {
}
+1 : array(0) {
}
-1 : array(0) {
}
0x0A : array(0) {
}
012 : array(0) {
}
0.1 : array(0) {
}
1e3 : array(0) {
}
1e-3 : array(0) {
}
array("") : array(0) {
}
array("a") : array(1) {
  [0]=>
  string(1) "a"
}
array(array("a")) : array(1) {
  [0]=>
  array(1) {
    [0]=>
    string(1) "a"
  }
}
TRUE : array(0) {
}
FALSE : array(0) {
}
object : array(0) {
}
fopen : array(0) {
}
ちなみに、実際に使用するときは以下のように判別して使用します。

Validation その1

スクリプトを書いていて気を使うところは変数のバリデーションです。
今回はその中で、scalar値かどうかの判別について考えたいと思います。

まず、取得したい値と弾きたい値の仕様について考えます。
取得したい値
  • integer
  • float
  • string
  • boolean

弾きたい値
  • NULL
  • array
  • object
  • resouce

というわけで、実装した関数はこうなりました。

サンプルコード

実行結果
NULL : string(0) ""
"" : string(0) ""
"a" : string(1) "a"
0 : int(0)
1 : int(1)
+1 : int(1)
-1 : int(-1)
0x0A : int(10)
012 : int(10)
0.1 : float(0.1)
1e3 : float(1000)
1e-3 : float(0.001)
array("") : string(0) ""
array("a") : string(0) ""
array(array("a")) : string(0) ""
TRUE : bool(true)
FALSE : bool(false)
object : string(0) ""
fopen : string(0) ""

上記の通り、特に問題なさそうです。
スカラー値を取得したいときはこの関数を使用していきたいと思います。