ヽ|∵|ゝ(Fantom) の 開発blog? ホーム » Java »【Java】isNumber(), isNumeric() のような数値かどうかを調べる関数を作る

【Java】isNumber(), isNumeric() のような数値かどうかを調べる関数を作る  


 今まで気が付かなかったけど、文字列が数値かどうかを判別する「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",
(前後空白を含むもの), (サフィックス等文字を含むもの)

 外部ライブラリは便利だけど、増えすぎるとファイルサイズ大きくなってしまうしね。ちょっと長いけど、そこそこパフォーマンスが良いみたいなので、用途が限定しているならこれで十分かも。


スポンサーサイト

category: Java

thread: プログラミング

janre: コンピュータ

tag: 算術関数 
tb: 0   cm: --


トラックバック

トラックバックURL
→http://fantom1x.blog130.fc2.com/tb.php/156-eec16077
この記事にトラックバックする(FC2ブログユーザー)

プロフィール

検索フォーム

全記事一覧

カテゴリ

ユーザータグ

最新記事

リンク

PR

▲ Pagetop