質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

1回答

3133閲覧

正規表現でdouble型(小数)かどうかをチェックしたい

k499778

総合スコア599

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2017/12/27 16:39

現在Javaでdouble型(小数)かどうかのチェックをしたいと思っています。

コード修正をする対応で、前回のソースが正規表現で書かれており、それに伴った書かれ方をしているので今回も影響範囲が少ないよう正規表現で書きたいと思っています。

その表現方法をご教示頂きたいです。
よろしくお願い致します。

以下のチェック方法もあるかもしれませんが、正規表現での示し方も知りたいです。
// 小数か
try {
// double型に変換できるかチェック
java.lang.Double.parseDouble( input ) ;

} catch ( NumberFormatException e ) {
// int の範囲を超えるが double の範囲を超えない整数の場合、ここを通ります。
}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

「浮動小数点数に変換できるかどうかはさておき、文法的に合法か」というチェックなら正規表現でも書けると思いますが、そのような正規表現は結構複雑であるにもかかわらずチェックをパスしたとしても変換できるとは限らず、オーバーフローとかアンダーフローあるいは桁落ちなどが起きると思います。それまでも含めて正規表現のみでチェックするのは現実的ではないと思います。ちなみに、NaNやInfinityの扱いはどうするのでしょう?察するに「それは対象外とする」のだろうと思いますが・・・

要件がいまひとつ漠然としている気がします。自分なら正規表現を考える前に「何をOKにし、何をNGにしなければならないのかの要件」を確認すると思います。

例えば

  • 符号は「なし」「+」「-」のいずれか
  • 整数部の桁数は1~10
  • 小数部の桁数は0~2
  • 小数部がない場合は小数点も省略しなければならない

などの制約がわかったなら「10進数で12桁程度の精度ならdoubleに変換してもオーバーフロー・アンダーフローの心配はなく、誤差の問題しかない」と判断し上記どおりの正規表現を考えると思います。

もしそのような仕様がなく「doubleに変換できるかどうかをチェックする」とだけ書かれていたとすると、自分ならparseDoubleを考えると思います。

整数についても同様で「9桁以内の整数」などという縛りがあるならparseIntを使うまでもなく正規表現で充分可能ですが、「2147483647はOKにして2147483648をNGにしなければならない」のだとしたら正規表現では厳しすぎると思います。

投稿2017/12/27 17:40

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

swordone

2017/12/27 18:25

時々この手の議論が出てきて思うのは、数値変換失敗時の例外が非チェック例外であることの不思議。 非チェック例外はざっくり言えば「適切な処理をすれば事前に発生を阻止できるもの」という説明がそこかしこでされているが、これを事前に形式チェックなどで阻止するのは難しいですよね…
KSwordOfHaste

2017/12/27 20:48

自分もJavaを始めたころNumberFormatExceptionはなぜ非チェック例外なのだろうと思いました。その当時「例外の処理忘れを気づかせてくれるとても良い仕様なのになんでだろう」と考えていました。 ただ非チェック例外って今日では受けがよくないですよね。自分はfunctional interfaceのありがたみが半減してしまう点が一番キビシイと感じます。言語仕様の縛りをも少し緩くして「@IgnoreExceptionアノテーションで無視できます」ぐらいの仕様でもいいかもと思う今日このごろです。Java以外で書いているとどうしてもそう思えてきて・・・
KSwordOfHaste

2017/12/27 21:15

すみません、ちょっと本論から脱線したコメントでした。「事前に発生を阻止できる」という解釈はそれなりに納得できるものなんですが、おっしゃるとおりNumberFormatExceptionを阻止するチェックはえらく面倒で自分でparseInt/parseDoubleを書くのとほぼ同様の手間がかかるので現実的じゃないですよね。かといってC#のようにTryParseなんてものがあったら嬉しいかというとそれも少し違う気がしてきます。そう感じるのはOptionalのようにモナド的なものに触れたからだと思います。モナドならこうした悩ましい点がなくいいとこどりのような気がします。
k499778

2017/12/27 23:42

回答ありがとうございます。 そうですね。double型と言いましたが、小数かどうかのチェックになります。そしてチェックする値はString型になります。 整数または小数のチェックです。 以下の書き方でJavaで通用しますでしょうか? \d+(.\d+)?
k499778

2017/12/27 23:44

^や$をつけて前方一致、後方一致などはいりますでしょうか?
KSwordOfHaste

2017/12/28 00:16 編集

正規表現自体も文字列として指定する必要があり、Javaの文字列定数の文法に従いエスケープが必要ですので "\d+(\.\d+)?" となります。符号が必要なく、また桁落ちを気にしなくてよいならそれでよいと思います。 ^$については実際にやってみるとわかると思います。 正規表現については下記APIリファレンスにJavaで用いることのできる仕様が確認できますよ。 https://docs.oracle.com/javase/jp/8/docs/api/java/util/regex/Pattern.html
k499778

2017/12/31 02:59

返答ありがとうございます。助かりました。正規表現も使い始めて来たので慣れるように勉強します
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問