-2

string から整数を取得しようとしています'(3)'。ただし、メソッドは をto_i返します0。引用符付きの括弧が問題を引き起こしているようですが、理由はわかりません。

'3'.to_i => 3
(3).to_i => 3
'(3)'.to_i => 0

なぜそれが起こり、どのように解決するのですか?ありがとうございました!

4

3 に答える 3

2

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
于 2013-09-28T11:21:46.703 に答える
1

(3)文字列ではなく式です。数値 に評価され3ます。

'3'は文字列リテラルで、数値には評価されませんが、 でキャストできますto_i。ルールは非常に単純です:

str の先頭文字を基数 (2 ~ 36) の整数として解釈した結果を返します。有効な数値の末尾を超える余分な文字は無視されます。str の先頭に有効な数値がない場合は、0 が返されます。base が有効な場合、このメソッドは例外を発生させません。

'(3)'は別の文字列リテラルですが、単独では数値に評価されません。(問題は、パーサーに、この特定の文字列の先頭を区切り文字として扱い、本質的に無視する必要があることを何とか「理解」させることができないことです。それはそれがどのように機能するかではありません。

(考えられる解決策の 1 つは、文字列の先頭にある記号を次のように置き換えることですsub(末尾の数字以外の記号は によって無視されるためto_i)。

'(3)'.sub(/^\(/, '').to_i => 3

しかし、なぜここで最初に括弧を取得するのか、本当に疑問に思います。

于 2013-09-28T11:10:03.493 に答える