質問

私は、文字列と言う '123', して大事にしていきたいと思いに変換す 123.

しかできない some_string.to_i, がに変換する 'lolipops'0, なに影響しています。っていない場合については、ブローに直面しよう変換するものは無効とさせるブルーのオシャレなり、痛みを伴う Exception.なんと区別する有効な 0 とうな番号です。

編集: この標準の方法で、regex trickery.

役に立ちましたか?

解決

ルビーはこの機能が組み込まれて:

Integer('1001')                                    # => 1001  
Integer('1001 nights')  
# ArgumentError: invalid value for Integer: "1001 nights"  

としては回答による ジョセフPecoraro, するためには、時計の文字列にとって有効な非小数点数などを始め 0x 六角軸と 0b バイナリー、トリッキー番号ゼロから始するとして構文解析octal.

Ruby1.9.2追加オプションの第二引数を基数で上記の問題を回避する:

Integer('23')                                     # => 23
Integer('0x23')                                   # => 35
Integer('023')                                    # => 19
Integer('0x23', 10)
# => #<ArgumentError: invalid value for Integer: "0x23">
Integer('023', 10)                                # => 23

他のヒント

この仕事:

i.to_i if i.match(/^\d+$/)

また認識させること、それに影響を及ぼす現在の受理解が解析ではhex、octal、バイナリー数:

>> Integer('0x15')
# => 21  
>> Integer('0b10')
# => 2  
>> Integer('077')
# => 63

Rubyでの数字で始ま 0x または 0X はhex、 0b または 0B はバイナリー、 0 はoctal.ない場合、望みの挙動の場合その他のソリューションチェックインの場合は文字列パターンに一致す。のように /\d+/ 正規表現など。

他の予期せぬ挙動の可溶液(1.8,1.9はok):

>> Integer(:foobar)
=> 26017
>> Integer(:yikes)
=> 26025

していただけずれているのではと考えていますが渡されただくには、追加 .to_s.

私のようにロンの応答からRubyの病気の "私は用いられていないJava/C#んな、なんとかこの遺産のようなものです。.開任意のクラスの危険にされますと、失活する恐れがあり控えめに、 特に その一部にはRubyのコア図書館があります。と言うつもりはありませんなんに使うのですが、通常は容易なことになるのがより良いオプションなど

class IntegerInString < String

  def initialize( s )
    fail ArgumentError, "The string '#{s}' is not an integer in a string, it's just a string." unless s =~ /^\-?[0-9]+$/
    super
  end
end

そのまま使用を希望する文字列が複数できませんclobberの他コアクラスなど

n = IntegerInString.new "2"
n.to_i
# => 2

IntegerInString.new "blob"
ArgumentError: The string 'blob' is not an integer in a string, it's just a string.

を追加できるあらゆるその他のチェックを初期化のように、確認のための二進数等主なものであることRubyは人と人と 透明度.ネーミングオブジェクトを使ってその変数名 クラス名もの 多く がより明確になる。

またそれらを取り扱えるように前回の私のプロジェクトも実施したが、少し異なる:

class NotAnIntError < StandardError 
end

class String
  def is_int?    
    self =~ /^-?[0-9]+$/
  end

  def safe_to_i
    return self.to_i if is_int?
    raise NotAnIntError, "The string '#{self}' is not a valid integer.", caller
  end
end

class Integer
  def safe_to_i
    return self
  end            
end

class StringExtensions < Test::Unit::TestCase

  def test_is_int
    assert "98234".is_int?
    assert "-2342".is_int?
    assert "02342".is_int?
    assert !"+342".is_int?
    assert !"3-42".is_int?
    assert !"342.234".is_int?
    assert !"a342".is_int?
    assert !"342a".is_int?
  end

  def test_safe_to_i
    assert 234234 == 234234.safe_to_i
    assert 237 == "237".safe_to_i
    begin
      "a word".safe_to_i
      fail 'safe_to_i did not raise the expected error.'
    rescue NotAnIntError 
      # this is what we expect..
    end
  end

end
someString = "asdfasd123"
number = someString.to_i
if someString != number.to_s
  puts "oops, this isn't a number"
end

れていないことが考えられるクリーンについて教えてくださいが必要です。

Re: フランス生まれの答え

実装しましょうようなもの"1a"または"b2"。こう:

def safeParse2(strToParse)
  if strToParse =~ /\A\d+\Z/
    strToParse.to_i
  else
    raise Exception
  end
end

["100", "1a", "b2", "t"].each do |number|
  begin
    puts safeParse2(number)
  rescue Exception
    puts "#{number} is invalid"
  end
end

この出力:

100
1a is invalid
b2 is invalid
t is invalid
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top