Edited at

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

More than 1 year has passed since last update.


やりたい

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

入力(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