- ベストアンサー
変数の中は文字列か数値か調べたい。
タイトルのとおり、変数に代入された値が 文字列か数値か調べたいのですが、 関数、モジュール、その他の方法等ありましたら 教えてください。よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
No.4 です。 すいません。 ご指摘の通り、. の前に \ が必要です。 if( /^-?\d+\.?\d*$/ ) { }
その他の回答 (7)
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
CPANのRegexp::Commonを使って $x =~ m{^$RE{num}{real}$}
- Tacosan
- ベストアンサー率23% (3656/15482)
ちょっと頑張ってみる: /^[+-]?(0[0-7]*|0x[0-9a-f]+|[1-9]\d*|(0\.?|[1-9]\d*|0?\.\d+|[1-9]\d*\.\d*)e[+-]?\d+$/i; わけわからん.
- Tacosan
- ベストアンサー率23% (3656/15482)
数値か文字列かを区別したい状況ってのがよくわからないんですが, 何をしたいんですか?
補足
皆様ご回答ありがとうございます。 正規表現が一番手っ取り早いようですね。 Tacosan様。 たとえば、Perlと同じく文字列と数値を区別しないASP言語では IsNumeric() という関数があります。これは、 val1 = "3" val2 = "文字列" というように、変数に値を代入しておいて、 IsN = IsNumeric(val1) とすると、変数IsNにはTrueが戻ります。 IsN = IsNumeric(val2) とすると、変数IsNにはFalseが戻ります。 つまり数値と評価できる文字列にはTureを返します。 これと同じような関数等を探しているのです。 まだいろいろな方法を知りたいので、「私はこうしてるよ」という方がおられましたら、ご回答よろしくお願いします。
- kentarou2333
- ベストアンサー率42% (65/152)
正規表現の場合は、下記のものがいいです。 if( /^-?\d+.?\d*$/ ) { } 他の方の場合は、負の数や、一桁の数字では問題が起こってしまうようです。
補足
ご回答ありがとうございます。 正規表現あまり使ったことがないので、 マニュアル見ながら解読して意味を理解できましたが、 /^-?\d+.?\d*$/ 真ん中のあたりの "." を "\." としなくてもいいんでしょうか。ここだけ引っかかっています。
- omni2
- ベストアンサー率53% (33/62)
No2です。すみません。小数点に対応しておりませんでした。 こちらのほうがいいかもしれません。自信はありませんが・・ my $a = "12345文字"; my $b = 12345; my $c = 123.567; if( $a =~ /^\d+\.?\d+$/){print '$aは数字です';} else{print '$aは文字です';} print "\n"; if( $b =~ /^\d+\.?\d+$/){print '$bは数字です';} else{print '$bは文字です';} print "\n"; if( $c =~ /^\d+\.?\d+$/){print '$cは数字です';} else{print '$cは文字です';} print "\n";
- omni2
- ベストアンサー率53% (33/62)
自信はありませんが、正規表現であらわすなら、 my $a = "12345文字"; my $b = 12345; if( $a =~ /^\d+$/){print '$aは数字です';} else{print '$aは文字です';} print "\n"; if( $b =~ /^\d+$/){print '$bは数字です';} else{print '$bは文字です';} print "\n"; これでいちおうできそうです。他の方の回答も参考にしたほうがいいです。便利な関数などあるかもしれません。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
Perlの変数は、文字列と数値を区別しません。 なので、 $x="1.23"; は、文字列としてセットしているつもりですが、 文字列としても数値としても有効で、 文字列として評価されるときは文字列として 数値として評価されるときは数値として評価されるので、それを区別することはできません。(と思う) 便宜上数値と判断できるものを数値と見なすということであれば、 sub isNum($){ my ($x) = @_; return $x eq $x * 1; } とかすればいいかと思いますが、 うまくいかない場合もあるかもしれません。
お礼
皆様ご回答ありがとうございました。 やはりどれも正規表現を使いますね。 BLUEPIXY様。何度も回答していただき、さらにモジュールを紹介していただきありがとうございました。 ポイントの件ですが一番最初によい回答をいただいた、kentarou2333様に20。 次に一番に回答をいただいたBLUEPIXY様に10。 ということにさせていただきます。