BigDecimal の stripTrailingZeros 使ってる人は気をつけて


はじめに

お仕事で BigDecimal の stripTrailingZeros というメソッドを使っていて悲しくなったので記事にしました

stripTrailingZeros って何?

BigDecimal のメソッドで、末尾のゼロが削除された新しい BigDecimal を返します。

簡単にいうとこんな感じ

0.00 であれば 0
0.10 であれば 0.1

何があったのか

動作確認をしていると、 0.00% と表示されてしまうことがありました。

「あれ?ちゃんとエミュレーターでも動き確認してたのになぜ??」

調べてみると stripTrailingZeros が正常に動いてなさそう、、!

なぜ〜〜〜〜

原因

なんと、JDK7 だと正常に動作しないとのこと。。。

そりゃないよ。。

なので一部の Android 端末だと正常に動作しません

Google IssueTracker にあげられてました

こんな感じになります。正常に動作するものとしないものが混じってるのがほんと厄介で気付きにくいです。。

fun printStripTrailingZeros(text: String) {
  println(BigDecimal(text).stripTrailingZeros())
}

printStripTrailingZeros("1.0")
printStripTrailingZeros("0.0")
printStripTrailingZeros("0.00")
printStripTrailingZeros("0.10")

// result
// 1
// 0.0
// 0.00
// 0.1

対処方法

画面に表示する際に compareTo で比較して、BigDecimal.ZERO と等しければ 0 を表示するようにしました。
正規表現でも可能ですが、ひとまずはこれで良さそうです(めんどくさいだけ笑)

おわりに

他にも何か気をつけた方がいい点あれば教えていただけたら幸いです

みなさんも本当にお気をつけください!!