JavaScriptの整数判定を正規表現(/^\d+$)だけでしてはいけない

JavaScriptの整数判定は /^\d+$/ ではダメ

JavaScriptの整数判定のために /^\d+$/ のような関数を作成して使っているWebサイトをよく見かけます。

JavaScript
const isInteger = (value) => /^\d+$/.test(value)
または
const isInteger = (value) => /^[0-9]+$/.test(value)

このコードでは入力フォームなどから受け取った値だと整数を正しく判定できません。

整数とはマイナスの値も含むので、前述の正規表現だと「-1」や「-2」などが整数とみなされません。

さらに、小数点が付いていても「2.0」は整数なので、/^\d+$/ の正規表現では正しく判定できません。

/^\d+$/ は整数ではなく、始まりから終わりまで連続する数字であることに注意が必要です。

Number.isIntegerで判定してはいけない

JavaScriptにはNumber.isIntegerという渡された値が整数かどうかを判定するメソッドがあります。

しかし、Number.isIntegerは文字列の数字の場合は整数でもfalse判定になります。

そのため、入力フォームから文字列で受け取る場合はNumberによる変換も必要です。

JavaScript
const isInteger = (value) => Number.isInteger(Number(value))

ただし、Number.isIntegerは「1e3」のような指数表記もtrueになるので、入力フォームの整数の判定には不向きです。

また、Numberはvalueが空文字だと「0」に変換されるので、これもフォームの値の判定には使えません。

JavaScriptの正しい整数判定

以下のコードであれば整数を意図したとおりに判定できます。

JavaScript
const isInteger = (value) => Number.isInteger(Number(value)) && /^-?[\d\.]+$/.test(value)
console.log('=== Number ===')
console.log(isInteger(null)) // false
console.log(isInteger(-1)) // true
console.log(isInteger(0)) // true
console.log(isInteger(1)) // true
console.log(isInteger(1.5)) // false
console.log(isInteger(+2)) // true
console.log(isInteger(-3)) // true
console.log('=== String ===')
console.log(isInteger('')) // false
console.log(isInteger('-1')) // true
console.log(isInteger('1')) // true
console.log(isInteger('1.5')) // false
console.log(isInteger('2.0')) // true
console.log(isInteger('2.0.0')) // false
console.log(isInteger('1e3')) // false

APIから必ず0〜9の数字しか返ってこないので「/^\d+$/」で良いケースや、「1e3」も整数として扱いたいケースもプロジェクトによってはあるので、その場合は必要に応じてコードを変更してください。