• ベストアンサー

変数の中は文字列か数値か調べたい。

タイトルのとおり、変数に代入された値が 文字列か数値か調べたいのですが、 関数、モジュール、その他の方法等ありましたら 教えてください。よろしくお願いします。

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

  • ベストアンサー
回答No.6

No.4 です。 すいません。 ご指摘の通り、. の前に \ が必要です。 if( /^-?\d+\.?\d*$/ ) { }

その他の回答 (7)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.8

CPANのRegexp::Commonを使って $x =~ m{^$RE{num}{real}$}

vvat2
質問者

お礼

皆様ご回答ありがとうございました。 やはりどれも正規表現を使いますね。 BLUEPIXY様。何度も回答していただき、さらにモジュールを紹介していただきありがとうございました。 ポイントの件ですが一番最初によい回答をいただいた、kentarou2333様に20。 次に一番に回答をいただいたBLUEPIXY様に10。 ということにさせていただきます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.7

ちょっと頑張ってみる: /^[+-]?(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)
回答No.5

数値か文字列かを区別したい状況ってのがよくわからないんですが, 何をしたいんですか?

vvat2
質問者

補足

皆様ご回答ありがとうございます。 正規表現が一番手っ取り早いようですね。 Tacosan様。 たとえば、Perlと同じく文字列と数値を区別しないASP言語では IsNumeric() という関数があります。これは、 val1 = "3" val2 = "文字列" というように、変数に値を代入しておいて、 IsN = IsNumeric(val1) とすると、変数IsNにはTrueが戻ります。 IsN = IsNumeric(val2) とすると、変数IsNにはFalseが戻ります。 つまり数値と評価できる文字列にはTureを返します。 これと同じような関数等を探しているのです。 まだいろいろな方法を知りたいので、「私はこうしてるよ」という方がおられましたら、ご回答よろしくお願いします。

回答No.4

正規表現の場合は、下記のものがいいです。 if( /^-?\d+.?\d*$/ ) { } 他の方の場合は、負の数や、一桁の数字では問題が起こってしまうようです。

vvat2
質問者

補足

ご回答ありがとうございます。 正規表現あまり使ったことがないので、 マニュアル見ながら解読して意味を理解できましたが、 /^-?\d+.?\d*$/ 真ん中のあたりの "." を "\." としなくてもいいんでしょうか。ここだけ引っかかっています。

  • omni2
  • ベストアンサー率53% (33/62)
回答No.3

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)
回答No.2

自信はありませんが、正規表現であらわすなら、 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)
回答No.1

Perlの変数は、文字列と数値を区別しません。 なので、 $x="1.23"; は、文字列としてセットしているつもりですが、 文字列としても数値としても有効で、 文字列として評価されるときは文字列として 数値として評価されるときは数値として評価されるので、それを区別することはできません。(と思う) 便宜上数値と判断できるものを数値と見なすということであれば、 sub isNum($){ my ($x) = @_; return $x eq $x * 1; } とかすればいいかと思いますが、 うまくいかない場合もあるかもしれません。

関連するQ&A

専門家に質問してみよう