1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Lua で数値の型チェック(整数なのか浮動小数点なのかを判定する方法)

Last updated at Posted at 2017-08-04

この文書の目的

Lua の関数において、引数として渡された値が整数であることを確認したい場合がたまにあります。そのような場合に使える、isInteger 関数の実装方法について説明します。全く同様の仕組みで、実数値のときのみ true を返す isReal 関数についても紹介します。

動作確認した Lua のバージョン

Lua-5.3.4。本文書で使用する機能は基本的なもののみですので、最近の Lua であれば動くと思います。

しくみ

引数が数値であるか否かは type 関数で判断できます(数値ならば number という文字列が返ります)。これを利用し、文字列などのデータ型との区別ができます。

ex_type.txt
> type(1)
number
> type(1.1)
number
> type("1")
string

問題となるのは、整数値であるか浮動小数点値であるかの判断ですが、これは 1 で除算した余りを用いて判断できます。もちろん、1.2 など、小数点以下に値を持つ場合は余りが 0 になりません。

ex_isInteger_check1.txt
> 1.2 % 1
0.2
> 1 % 1
0

剰余を使った方法で完全かといえば、そうではありません。問題は、1.0 など、値としては整数値であるが、表記としては浮動小数点値をとっている場合です。幸い、1.0 を 1 で割った余りは 0.0 となりますので、得られた剰余を空文字列と連結させて文字列化し、文字列 "0" と比較すれば isInteger 関数を実現できます。

ex_isInteger_check2.txt
> 1.0 % 1
0.0
> 1.0 % 1 .."" =="0"
false

コードの例

関数の引数として、整数が渡された場合には true を、浮動小数点値や文字列その他の値が渡された場合には false を返す、isInteger 関数を以下に示します。

isInteger.lua
function isInteger(inVal)
    if type(inVal)~="number" then
        return false
    else
        return inVal%1 ..""=="0"
    end
end

使用例

ex_isInteger.txt
> isInteger(1)
true
> isInteger(1.2)
false
> isInteger(1.0)
false
> isInteger("1")
false

全く同様にして、浮動小数点値だったら true を返す isReal 関数も以下のように実装できます。

isReal.lua
function isReal(inVal)
    if type(inVal)~="number" then
        return false
    else
        return inVal%1 ..""~="0"
    end
end

こちらも使用例を。

ex_isReal.txt
> isReal(1.0)
true
> isReal(1)
false
> isReal(1.1)
true
> isReal("1.1")
false

まとめ

本文書では、整数値と浮動小数点値で、1 で割った余りが異なることを活用して、渡された値が整数であるかどうかを判定する方法を紹介しました。具体的な実装例では、文字列化することにより、1 と 1.0 を区別しました。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?