string から整数を取得しようとしています'(3)'
。ただし、メソッドは をto_i
返します0
。引用符付きの括弧が問題を引き起こしているようですが、理由はわかりません。
'3'.to_i => 3
(3).to_i => 3
'(3)'.to_i => 0
なぜそれが起こり、どのように解決するのですか?ありがとうございました!
String#to_i
末尾の (数字以外の) 文字を無視します。
"3foo".to_i #=> 3
"3)".to_i #=> 3
先頭の (数字以外の) 文字は機能せず、次のように返され0
ます。
"foo3".to_i #=> 0
"(3".to_i #=> 0
正規表現を使用して整数部分を抽出できます。
"(3)"[/-?\d+/] #=> "3"
それを整数に変換します。
"(3)"[/-?\d+/].to_i #=> 3
(3)
文字列ではなく式です。数値 に評価され3
ます。
'3'
は文字列リテラルで、数値には評価されませんが、 でキャストできますto_i
。ルールは非常に単純です:
str の先頭文字を基数 (2 ~ 36) の整数として解釈した結果を返します。有効な数値の末尾を超える余分な文字は無視されます。str の先頭に有効な数値がない場合は、0 が返されます。base が有効な場合、このメソッドは例外を発生させません。
'(3)'
は別の文字列リテラルですが、単独では数値に評価されません。(
問題は、パーサーに、この特定の文字列の先頭を区切り文字として扱い、本質的に無視する必要があることを何とか「理解」させることができないことです。それはそれがどのように機能するかではありません。
(
考えられる解決策の 1 つは、文字列の先頭にある記号を次のように置き換えることですsub
(末尾の数字以外の記号は によって無視されるためto_i
)。
'(3)'.sub(/^\(/, '').to_i => 3
しかし、なぜここで最初に括弧を取得するのか、本当に疑問に思います。