• ベストアンサー

Perlで数値(小数点、負の数、指数を含む)チェックはできますか?

Perl(Version 5.005_03) で、値が数値(小数点、負の数、指数を含む)か否かを判定したいのですが、うまくいきません。何かよい方法はないでしょうか? お願いします。 【環境】sun4-solaris, apache

質問者が選んだベストアンサー

  • ベストアンサー
noname#227796
noname#227796
回答No.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){ こうかもしれない・・・

yuyu-chan
質問者

お礼

すごいですぅ~! 判定したい値は全てOKでした♪ > どこまでのを求めますか? 十分ですっ。 本当に、本当にありがとうございました。

その他の回答 (3)

noname#25358
noname#25358
回答No.3

 補足です。  俺の#2の回答についてですが、プラスマイナスの符号に対する処理が抜けてます。ミスでした(^_^;   if ( $val =~ /^(\+|\-)\.?\d+\.?\d*(E\+\d+|E\-\d+)?$) {  いちおー別の方の回答が出ているようですが、念のためにフィックスしておきます。

yuyu-chan
質問者

お礼

ありがとうございます。 アドバイスを頂いたおかげで、解決できました。 結局、 if ($val =~ /^(-|\+|)\d+\.?\d*(E\+\d+|E\-\d+)?$/i){ にしてみました。 もうちょっと、テストしてみてOKなら、これにします♪

noname#25358
noname#25358
回答No.2

 Perl は、変数はすべて(VBでいうところの)バリアント型なので、タダで判別する関数はありません。  指数を含むというのが面倒ですね(^_^;  こういうのはどうでしょう。   if ( $val =~ /^\d+\.?\d*(E\+\d+|E\-\d+)?$) {  これで真なら数値ということになると思うんですが……。

yuyu-chan
質問者

お礼

ありがとうございます。 if ($val =~ /^\d+\.?\d*(E\+\d+|E\-\d+)?$/i){ でやってみました。 ただ、「-1e-007」というような値を判別すると、文字列と判定されてしまうのですが。。。 ※「1e-007」は数値と判定されました。

noname#227796
noname#227796
回答No.1

/^(-|\+|)\d+(\.\d+|)(e\-\d+(\.\d+|)|e\+\d+(\.\d+|)|e\d+(\.\d+|)|)/i マッチングだとこんな感じ? #「.25」なんて0を省く場合を除いて もっとスマートに書けそうだが・・・

yuyu-chan
質問者

お礼

早速のご回答、ありがとうございました。 上記のマッチングで判定してみると、「-1.00ee-7」が数値として判定されてしまいました。(;_;) 結局、i_am_alive さんと、deagles さんの回答を混ぜて if ($val =~ /^(-|\+|)\d+\.?\d*(E\+\d+|E\-\d+)?$/i){ にしてみました。いまのところ、問題ないみたいです。 ありがとうございました。

関連するQ&A