やりたい
小数点以下の数を数えたい。
入力(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