13

質問への回答としてユーザーに番号を入力するように求めるコードがあります。私はできますto_iが、トリッキーな/ゴミの入力はから逃げますto_i。たとえば、ユーザーが693iirum5回答として入力した場合、#to_iはそれをに削除し693ます。

正規表現ではなく、関数を提案してください。返信ありがとうございます。

4

5 に答える 5

18

これにより、入力が検証されます。

Integer(gets) rescue nil
于 2013-02-15T17:56:20.133 に答える
3

が整数であるinput_string.to_i.to_s == input_stringかどうかを正規表現なしで確認するために使用します。input_string

> input_string = "11a12"
> input_string.to_i.to_s == input_string
=> false
> input_string = "11"
> input_string.to_i.to_s == input_string
=> true
> input_string = "11.5"
> input_string.to_i.to_s == input_string
=> false   
于 2013-02-15T18:00:11.770 に答える
2

カーネル#整数を使用

Kernel#Integerメソッドは、ArgumentError: invalid value for Integer()無効な値が渡された場合に発生します。メソッドの説明には、一部次のように記載されています。

[S]文字列は厳密に数値表現に準拠する必要があります。この動作は、String#to_i の動作とは異なります。

つまり、String#to_i強制的に値を整数にキャストしますが、Kernel#Integer はキャストする前に値が整形式であることを確認します。

の動作をシミュレートする例Integer(gets)

Integer(1)
# => 1

Integer('2')
# => 2

Integer("1foo2\n")
# => ArgumentError: invalid value for Integer(): "1foo2\n"
于 2013-02-15T18:20:43.137 に答える
0

to_iは問題ありませんが、ガベージ入力の場合に必要なものによって異なります。なし?integer(value)を使用して、整数でない場合はレスキューできます。Floatと同じです。693iirum5で他の何かを返す場合は、入力した文字列を解析でき、文字列をチェックするために正規表現が必要になります。あなたは私がしない正規表現を与えないように頼むので、おそらくあなたはそれが本当にそれを返したいものを明確にすることができます。

于 2013-02-15T18:01:01.520 に答える