commons-lang2系と3系のStringUtils.isNumericの動作の違いメモ
以前、仕事でライブラリのアップデート調査をしてた時にすでにわかってたつもりだったけど、
今日、別プロジェクトでバグとして上がってきたのでメモ。
バグの原因になっていたのは空文字の場合
s = "" println org.apache.commons.lang.StringUtils.isNumeric(s) println org.apache.commons.lang3.StringUtils.isNumeric(s) Result: true false
GroovyConsoleで動かしてます。
結果、2系の場合はtrue
を返し、3系はfalse
を返す。
数値判定に使えるメソッドのメモ
NumberUtilsでも2系3系関係なく使えるメソッドisNumber
、isDigits
s = "3" println org.apache.commons.lang.StringUtils.isNumeric(s) println org.apache.commons.lang3.StringUtils.isNumeric(s) println org.apache.commons.lang.math.NumberUtils.isDigits(s) println org.apache.commons.lang.math.NumberUtils.isNumber(s) println org.apache.commons.lang3.math.NumberUtils.isDigits(s) println org.apache.commons.lang3.math.NumberUtils.isNumber(s) Result: true true true false true false
StringUtils.isNumeric
とNumberUtils.isDigits
は全角の数字もtrue
と判断しますが、
NumberUtils.isNumber
はfalse
です。
マイナスと10進数以外の時の挙動
s = "-100" println org.apache.commons.lang.StringUtils.isNumeric(s) println org.apache.commons.lang3.StringUtils.isNumeric(s) println org.apache.commons.lang.math.NumberUtils.isDigits(s) println org.apache.commons.lang.math.NumberUtils.isNumber(s) println org.apache.commons.lang3.math.NumberUtils.isDigits(s) println org.apache.commons.lang3.math.NumberUtils.isNumber(s) Result: false false false true false true
s = "0xff" println org.apache.commons.lang.StringUtils.isNumeric(s) println org.apache.commons.lang3.StringUtils.isNumeric(s) println org.apache.commons.lang.math.NumberUtils.isDigits(s) println org.apache.commons.lang.math.NumberUtils.isNumber(s) println org.apache.commons.lang3.math.NumberUtils.isDigits(s) println org.apache.commons.lang3.math.NumberUtils.isNumber(s) Result: false false false true false true
上でメモしたメソッドは引数にnull
を渡しても、全てfalse
を返してくれます。