質問
私は、文字列と言う '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