1. ホーム
  2. ruby

文字列を厳密に整数に変換する(またはnilにする)

2023-10-22 23:53:54

質問

Webプログラミングでは、数値は文字列で入力されます。 しかし to_i は変換されます。 "5abc"5 であり "abc" から 0 であり、いずれも誤答である。これらをキャッチするために、私はこう書きました。

def number_or_nil( s )
  number = s.to_i
  number = nil if (number.to_s != s)
  return number
end

この変換を行い、文字列が数値として意図されていないことを検出する、よりきれいでRubyらしい方法はないでしょうか。

どのように解決するのですか?

整数(文字列)を使用する

文字列を整数に変換できない場合、ArgumentErrorエラーが発生します。

Integer('5abc') #=> ArgumentError: invalid value for Integer(): "5abc"
Integer('5') #=> 5

文字列が変換できないときにnilを返すようにしたい場合は、number_or_nilメソッドがまだ必要です。

def number_or_nil(string)
  Integer(string || '')
rescue ArgumentError
  nil
end

特定の例外からのレスキューに注意する必要があります。素の rescue ("rescue nil" など) は StandardError を継承したあらゆるエラーから rescue し、予期しない方法でプログラムの実行を妨害する可能性があります。Integer()はArgumentErrorを発生させるので、それを指定してください。

もし、例外を扱わず、単にnumber_or_nilの短いバージョンを好むなら、暗黙の戻り値を利用して、次のように書くことができます。

def number_or_nil(string)
  num = string.to_i
  num if num.to_s == string
end

number_or_nil '5' #=> 5
number_or_nil '5abc' #=> nil

これは期待通りに動作します。