質問への回答としてユーザーに番号を入力するように求めるコードがあります。私はできますto_i
が、トリッキーな/ゴミの入力はから逃げますto_i
。たとえば、ユーザーが693iirum5
回答として入力した場合、#to_iはそれをに削除し693
ます。
正規表現ではなく、関数を提案してください。返信ありがとうございます。
質問への回答としてユーザーに番号を入力するように求めるコードがあります。私はできますto_i
が、トリッキーな/ゴミの入力はから逃げますto_i
。たとえば、ユーザーが693iirum5
回答として入力した場合、#to_iはそれをに削除し693
ます。
正規表現ではなく、関数を提案してください。返信ありがとうございます。
これにより、入力が検証されます。
Integer(gets) rescue nil
が整数である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
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"
to_iは問題ありませんが、ガベージ入力の場合に必要なものによって異なります。なし?integer(value)を使用して、整数でない場合はレスキューできます。Floatと同じです。693iirum5で他の何かを返す場合は、入力した文字列を解析でき、文字列をチェックするために正規表現が必要になります。あなたは私がしない正規表現を与えないように頼むので、おそらくあなたはそれが本当にそれを返したいものを明確にすることができます。