JavaScriptで文字列の小数点の桁のチェック後はparseFloatも必要

JavaScriptで小数点の桁を判定

JavaScriptで例えば「数字が小数点第2位までか」を判定するコードは以下のようになります。

JavaScript
function isUpToSecondDecimal(value) {
  const num = Number(value)
  if (isNaN(num)) return false

  const decimalPart = num.toString().split('.')[1]
  return !decimalPart || decimalPart.length <= 2
}

console.log(isUpToSecondDecimal(123))      // true(小数なし)
console.log(isUpToSecondDecimal(123.4))    // true(小数1位)
console.log(isUpToSecondDecimal(123.45))   // true(小数2位)
console.log(isUpToSecondDecimal(123.456))  // false(小数3位)
console.log(isUpToSecondDecimal('123.00')) // true(文字列でもOK)
console.log(isUpToSecondDecimal('abc'))    // false(無効な入力)

一見すると正しいように見えますが、この判定だと '0123.00' や '0123.000' のように、文字列の数字に先頭かうしろに余分に0が付いている場合もtrueになってしまいます。

JavaScript
console.log(isUpToSecondDecimal('0123.00')) // true
console.log(isUpToSecondDecimal('123.000')) // true

そのため、この判定だとフォームで仮に '000123.00' や '123.00000' などを入力した場合は、エラーにならずに送信できてしまいます。

parseFloatで余分な0を取り除く

このように数字の先頭やうしろにある余分な0はparseFloat()で取り除けます。

JavaScript
console.log(parseFloat('000123.000000').toString()) // '123'
console.log(parseFloat('0123.450').toString()) // '123.45'

フォームだと数値ではなく数字で取得するため、小数点ありの場合には注意が必要です。

ちなみに、整数で返したい場合はparseIntを使用します。

JavaScript
console.log(parseInt('000123.000000').toString()) // '123'
console.log(parseInt('0123.450').toString()) // '123'