【Java】isNumber(), isNumeric() のような数値かどうかを調べる関数を作る 
2014/12/16 Tue [edit]
今まで気が付かなかったけど、文字列が数値かどうかを判別する「isNumber()」「isNumeric()」って Java には標準ではないのね。検索しても、commons-lang での使い方ばかりだったので、簡単なものを作ってみようと考えた。
//文字列が数値を表すとき真を返す
//※8進数、16進数には未対応。"1.000E+03" などの書式、サフィックス等も未対応。
public static final boolean isNumber(final String str) {
if (str == null || str.length() == 0) { //空文字
return false;
}
final char[] chars = str.toCharArray();
final int len = str.length();
int start = 0;
if (chars[0] == '-' || chars[0] == '+') { //頭の '+' も対応
start = 1;
}
boolean hasPoint = false; //'.' の検出
boolean hasNum = false; //数字の検出
for (int i = start; i < len; i++) {
if ('0' <= chars[i] && chars[i] <= '9') {
hasNum = true;
} else if (chars[i] == '.') {
if (hasPoint) { //2つ以上 '.' がある
return false;
} else {
hasPoint = true; //1つ目の '.'
}
} else {
return false; //数字以外
}
}
if (hasNum) {
return true;
}
return false; //数字が1つもない
}
元々、Integer.parseInt(str)、Float.parseFloat(str) を使う前にチェックしたかっただけなので、あまり細かい書式には対応してない。前後に空白が入っていると false になるので、引数は str.trim() で除去しておいた方が良いだろう。
また、試しに "+5" や "+1.2" みたいに '+' 符号をそれぞれ parseInt()、parseFloat() につっこんでみたら変換できたので、対応しておいた。"08" など頭に '0' がつくものは 8進数ではなく、10進数で変換されるみたいなので、それもそのまま残しておいた。"0x0a" みたいな 16進数には対応してないが、その場合は、Integer.decode("0x0a") を使うので考えないことにした。
以下は試した結果。
[true]
"1", "-1", "+1", "08", "-08", "+08", "-0", "-.5", "5.0", "-5.0", "+5.0", "5.", "-5.", "+5."
[false]
null, "", " ", "-", "+", "-.", "+-12", "+-12.34", "1,000", "0x0a", "100000L", "1.000E+03",
(前後空白を含むもの), (サフィックス等文字を含むもの)
外部ライブラリは便利だけど、増えすぎるとファイルサイズ大きくなってしまうしね。ちょっと長いけど、そこそこパフォーマンスが良いみたいなので、用途が限定しているならこれで十分かも。
- 関連記事
-
-
【Java】プリミティブ型での階乗計算
-
【Java】フィボナッチ数(数列)を求める
-
【Java】Math.floor(), ceil(), round() 動作互換アルゴリズムを試す
-
【Java】isNumber(), isNumeric() のような数値かどうかを調べる関数を作る
-
【Java】配列, リスト(List), 連想配列(Map) の初期化
-
トラックバック
トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/156-eec16077
この記事にトラックバックする(FC2ブログユーザー)
| h o m e |