この文書の目的
Lua の関数において、引数として渡された値が整数であることを確認したい場合がたまにあります。そのような場合に使える、isInteger 関数の実装方法について説明します。全く同様の仕組みで、実数値のときのみ true を返す isReal 関数についても紹介します。
動作確認した Lua のバージョン
Lua-5.3.4。本文書で使用する機能は基本的なもののみですので、最近の Lua であれば動くと思います。
しくみ
引数が数値であるか否かは type 関数で判断できます(数値ならば number という文字列が返ります)。これを利用し、文字列などのデータ型との区別ができます。
> type(1)
number
> type(1.1)
number
> type("1")
string
問題となるのは、整数値であるか浮動小数点値であるかの判断ですが、これは 1 で除算した余りを用いて判断できます。もちろん、1.2 など、小数点以下に値を持つ場合は余りが 0 になりません。
> 1.2 % 1
0.2
> 1 % 1
0
剰余を使った方法で完全かといえば、そうではありません。問題は、1.0 など、値としては整数値であるが、表記としては浮動小数点値をとっている場合です。幸い、1.0 を 1 で割った余りは 0.0 となりますので、得られた剰余を空文字列と連結させて文字列化し、文字列 "0" と比較すれば isInteger 関数を実現できます。
> 1.0 % 1
0.0
> 1.0 % 1 .."" =="0"
false
コードの例
関数の引数として、整数が渡された場合には true を、浮動小数点値や文字列その他の値が渡された場合には false を返す、isInteger 関数を以下に示します。
function isInteger(inVal)
if type(inVal)~="number" then
return false
else
return inVal%1 ..""=="0"
end
end
使用例
> isInteger(1)
true
> isInteger(1.2)
false
> isInteger(1.0)
false
> isInteger("1")
false
全く同様にして、浮動小数点値だったら true を返す isReal 関数も以下のように実装できます。
function isReal(inVal)
if type(inVal)~="number" then
return false
else
return inVal%1 ..""~="0"
end
end
こちらも使用例を。
> isReal(1.0)
true
> isReal(1)
false
> isReal(1.1)
true
> isReal("1.1")
false
まとめ
本文書では、整数値と浮動小数点値で、1 で割った余りが異なることを活用して、渡された値が整数であるかどうかを判定する方法を紹介しました。具体的な実装例では、文字列化することにより、1 と 1.0 を区別しました。