文字列を数値に変換できるかどうかのチェック。
apacheのライブラリに便利な関数があるみたいだけど、Java標準の機能だけでチェックする2つのやり方をメモ。
目次
try-catchでNumberFormatExceptionによるチェック
これは、「とりあえず文字列を数値に変換してみよう!例外発生したらその文字列は数値じゃない!」という判断。strTargetが数値に変換できないような文字列であれば、NumberFormatExceptionが投げられるのでそれをキャッチして判定する。
サンプルコード
1 2 3 4 5 6 7 8 9 10 |
String strTarget = "1"; int iTarget = 0; try{ iTarget = Integer.parseInt(strTarget); }catch(NumberFormatException e){ // 数値変換失敗時の処理 } |
100万回実行時の処理時間
strTargetに対していきなり数値変換を行っているやり方なので、問題無く数値に変換できるような値であれば無駄が無く高速。ただし、変換に失敗する場合は例外オブジェクトを生成するコストが高いためパフォーマンスが落ちる。
100万回すべて変換成功⇒ 47,964,646ns(約47ミリ秒)
100万回すべて変換失敗⇒1,370,820,732ns(約1,370ミリ秒)
正規表現によるチェック
もうひとつは正規表現によるチェック。srTargetが数値として妥当な文字列かどうかを正規表現でチェックして、チェックOKの場合のみ数値に変換する流れ。
サンプルコード
1 2 3 4 5 6 7 8 9 10 |
String strTarget = "x"; int iTarget = 0; if (strTarget.matches("^-?\\d+$")){ iTarget = Integer.parseInt(strTarget); }else{ // 数値変換失敗時の処理 } |
100万回実行時の処理時間
数値変換の前に正規表現により逐一チェック処理が走るため、変換成功時でも多少時間がかかる。ただし、変換不可の文字列については予め行われているチェック処理により例外の発生を防げるため、大幅な速度低下にはならない。
100万回すべて変換成功⇒709,987,365ns(約709ミリ秒)
100万回すべて変換失敗⇒493,286,375ns(約493ミリ秒)
どっちの方法が良いのかどうか正解はないけど、その文字列に数値以外の値が入ってくることが通常は考えられないような、念のため行うチェックのような場合はNumberFormatExceptionによるチェックで良い気がするし、数値以外の文字列が入ってくることがザラにあるような場合は予め正規表現でチェックする方が良いかな~。