読者です 読者をやめる 読者になる 読者になる

SHIBUYA 3%

(元在宅が)渋谷で働くエンジニアの備忘録的memo & 雑記 - ココロはいつもSHIBUYAに在り

commons-lang2系と3系のStringUtils.isNumericの動作の違いメモ

java

以前、仕事でライブラリのアップデート調査をしてた時にすでにわかってたつもりだったけど、
今日、別プロジェクトでバグとして上がってきたのでメモ。

バグの原因になっていたのは空文字の場合

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系関係なく使えるメソッドisNumberisDigits

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.isNumericNumberUtils.isDigitsは全角の数字もtrueと判断しますが、
NumberUtils.isNumberfalseです。

マイナスと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を返してくれます。