有馬@FITECです。

WATANABE Tetsuya <tetsu / jpn.hp.com> wrote
  "[ruby-list:15008] Re: 文字列から数値への変換失敗を検出したい"

| 渡辺哲也です。

| この辺の仕様は、Perl からきていると思います。

| のように、「解釈できるところまで」となっています。
| 最初にアルファベットなど数字以外がきてしまうと 0 
| を返します。
| 
| これは、C の atoi(3) の仕様からきているような気も
| しますが...

atoi(), atol(), atof() に由来するエラーを検出しないメソッドに対して、
stotol(), strtod() に由来するエラーを検出するメソッドがほしいところですよね。

| 私はたぶん /^\d/ で数字が最初にくるか比較してから
| 先に進める? ような形を書きそうです。

かなり詰めがあまいですが、手元の需要を満たす程度のメソッドを書いてみました。

class String
  def to_float
    return to_f if self =~ /^[-+]?((\d+)?(\.\d+))|((\d+)(\.\d+)?)([eE][-+]\d+)?$/
    raise "fail at convert string to float"
  end
  def to_int
    return to_i if self =~ /^[-+]?(\d+)$/
    raise "fail at convert string to int"
  end
end

def c x
    begin
      x.to_s.to_float
      begin
        x.to_s.to_int
        t = "int"
      rescue
        t = "float"
      end
    rescue
      t = "string"
    end
end

def checkall ar
  ar.each do |x|
    t = c(x)
    print t, " ", x, "\n"
  end
end

ar =  []
ar << "abc"
ar << "123"
ar << "1.23"
ar << "1.23e+4"
ar << ".123"
ar << "1e2"
checkall ar

--
 有馬 康弘 <fit0298 / fitec.co.jp>