- ベストアンサー
Perlで数値(小数点、負の数、指数を含む)チェックはできますか?
Perl(Version 5.005_03) で、値が数値(小数点、負の数、指数を含む)か否かを判定したいのですが、うまくいきません。何かよい方法はないでしょうか? お願いします。 【環境】sun4-solaris, apache
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ああ、「?」の存在を忘れていました。 そうそう if ($val =~ /^(-|\+|)\d+\.?\d*(E\+\d+|E\-\d+)?$/i){ だと、 -1.E+12 というのも引っかかります。 もちろんPerlとしては数値として扱われるので大丈夫ですが。 しかし、 -.5E+12 というのもPerl的には正しいはずなのに、こちらは引っかかりません。 -12E-4.5 -12E-.5 これらも正しいのにだめです。 どこまでのを求めますか?(^^; if ($val =~ /^(-|\+)?(\d+\.?\d*|\d*\.?\d+)(E\+(\d+\.?\d*|\d*\.?\d+)|E\-(\d+\.?\d*|\d*\.?\d+))?$/i){ こうかもしれない・・・
その他の回答 (3)
補足です。 俺の#2の回答についてですが、プラスマイナスの符号に対する処理が抜けてます。ミスでした(^_^; if ( $val =~ /^(\+|\-)\.?\d+\.?\d*(E\+\d+|E\-\d+)?$) { いちおー別の方の回答が出ているようですが、念のためにフィックスしておきます。
お礼
ありがとうございます。 アドバイスを頂いたおかげで、解決できました。 結局、 if ($val =~ /^(-|\+|)\d+\.?\d*(E\+\d+|E\-\d+)?$/i){ にしてみました。 もうちょっと、テストしてみてOKなら、これにします♪
Perl は、変数はすべて(VBでいうところの)バリアント型なので、タダで判別する関数はありません。 指数を含むというのが面倒ですね(^_^; こういうのはどうでしょう。 if ( $val =~ /^\d+\.?\d*(E\+\d+|E\-\d+)?$) { これで真なら数値ということになると思うんですが……。
お礼
ありがとうございます。 if ($val =~ /^\d+\.?\d*(E\+\d+|E\-\d+)?$/i){ でやってみました。 ただ、「-1e-007」というような値を判別すると、文字列と判定されてしまうのですが。。。 ※「1e-007」は数値と判定されました。
/^(-|\+|)\d+(\.\d+|)(e\-\d+(\.\d+|)|e\+\d+(\.\d+|)|e\d+(\.\d+|)|)/i マッチングだとこんな感じ? #「.25」なんて0を省く場合を除いて もっとスマートに書けそうだが・・・
お礼
早速のご回答、ありがとうございました。 上記のマッチングで判定してみると、「-1.00ee-7」が数値として判定されてしまいました。(;_;) 結局、i_am_alive さんと、deagles さんの回答を混ぜて if ($val =~ /^(-|\+|)\d+\.?\d*(E\+\d+|E\-\d+)?$/i){ にしてみました。いまのところ、問題ないみたいです。 ありがとうございました。
お礼
すごいですぅ~! 判定したい値は全てOKでした♪ > どこまでのを求めますか? 十分ですっ。 本当に、本当にありがとうございました。