Java

Javaで小数点以下の桁数を数える

やりたい

小数点以下の数を数えたい。

入力(Float) 出力(int)
0.0 0
1.0 0
0.1 1
11.1 1
0.001 3

コード

public int getPrecision(Float val){
  // JavaではFloat⇒int変換するやりかたは無駄な処理が多いので文字列化して数える
  String str = String.valueOf(val);

  // 文末が ".0"とか".00000"で終わってるやつは全部桁0とする
  if(str.matches("^.*\\.0+$")){
    return 0;
  }

  int index = str.indexOf(".");
  return str.substring(index + 1).length();
}

結果

やりたいことができる。

以下、これを作るにあたってハマった話

最初、正規表現の部分を

str.matches("\\.0+$")

として書いたところ、出力がおかしいことになった。

入力 0.0 出力 1 ←間違い
入力 0.1 出力 1 ←正しい

あれ?

デバッグしてみると、

"0.0".matches("\\.0+$")
//結果:false

あれ?マッチしてない

実は、このコード、以下のコードと同義だった。

"0.0".matches("^\\.0+$$")
//結果:false

結論

javaでString.matchesメソッドを使うときは ^$を含めたregexにしよう

// \\.0+$ の正規表現を使いたいときは。。。
"0.0".matches("^.*\\.0+$")
//結果:true

参考

http://d.hatena.ne.jp/kakkun61/20100104/1262605869