2012-04-10 8 views
28

ein String-Objekt wie folgt gegeben:Unterschied zwischen Integer (Wert) und value.to_i

twohundred = "200" 

Was ist der Unterschied zwischen tun ist:

Integer(twohundred) #=> 200 

und:

twohundred.to_i  #=> 200 

Gibt es einen Unterschied? Ist es empfehlenswert, eins unter den anderen zu verwenden?

Antwort

35

Integer(num) wird eine ArgumentError Ausnahme auslösen, wenn num keine gültige Ganzzahl ist (Sie können die Basis angeben).

num.to_i wird so viel konvertieren, wie er kann.

Zum Beispiel:

"2hi".to_i 
#=> 2 

Integer("2hi") 
#=> throws ArgumentError 

"hi".to_i 
#=> 0 

Integer("hi") 
#=> throws ArgumentError 

"2.0".to_i 
#=> 2 

Integer("2.0") 
#=> throws ArgumentError 
+0

Tolle Antwort. Vielen Dank. – Nobita

+0

Beachten Sie, dass Sie die Basis für beide angeben können: ('Kernel # Integer') (http://ruby-doc.org/core-2.3.1/Kernel.html#method-i-Integer) und [' String # to_i'] (http://ruby-doc.org/core-2.3.1/String.html#method-i-to_i). – Stefan

+0

Ein weiterer bemerkenswerter Fall ist '' 'nil.to_i # => 0''', während' '' Integer (nil) # => typeError: kann nil nicht in Integer''' – Levsero

8

Von Ruby documentation für Integer():

Integer(arg,base=0) → integer ... If arg is a String, when base is omitted or equals to zero, radix indicators (0, 0b, and 0x) are honored. In any case, strings should be strictly conformed to numeric representation. This behavior is different from that of String#to_i.

Mit anderen Worten, Integer("0x100") => 256 und "0x100".to_i => 0.

+0

z. "0x10" .to_i "ergibt" 0 ", während" Integer "(" 0x10 ")" 16 "ergibt – Phrogz

+0

" 0x10 ".to_i (16)" ergibt aber auch "16". – Stefan

0

Untersuchen wir die Unterschiede zwischen der Verwendung der Instanzmethode String#to_i und der Modulmethode Kernel::Integer. Zunächst aber wollen wir die später in einem anderen Verfahren einzubetten int1:

def int1(str) 
    Integer(str) rescue nil 
end 

diese Weise, wenn str nicht als ganze Zahl aufgefasst werden kann, Integer wird eine ArgumentError Ausnahme auslösen, wodurch die in-line Rettungs nil zurückzukehren. Wenn Integer keine execption erhöhen int die ganze Zahl Äquivalent der Zeichenfolge zurück.

Um die Vergleiche abzurunden, fügen wir auch einen regulären Ausdruck hinzu, der bestätigt, dass der Inhalt des Strings eine Ganzzahl darstellt, bevor to_i für die Konvertierung verwendet wird.

R =/
    (?<=\A|\s) # match beginning of string or whitespace character (positive lookbehind) 
    -?   # optionally match a minus sign 
    \d+  # match one or more digits 
    (?=\s|\z) # match whitespace character or end of string (positive lookahead) 
    /x   # free spacing regex definition mode 

def int2(str) 
    str =~ R ? str.to_i : nil 
end 

Wie bei int1, wenn str nicht als ganze Zahl angesehen werden, werden int2nil zurückzukehren; Andernfalls gibt int das Ganzzahläquivalent der Zeichenfolge zurück.

Lassen Sie uns einige Vergleiche versuchen.

str = '3' 
str.to_i  #=> 3 
int1(str)  #=> 3 
int2(str)  #=> 3 

str = '-3' 
str.to_i  #=> -3 
int1(str)  #=> -3 
int2(str)  #=> -3 

str = '3.0' 
str.to_i  #=> 3 
int1(str)  #=> nil 
int2(str)  #=> nil 

str = '3.2' 
str.to_i  #=> 3 
int1(str)  #=> nil 
int2(str)  #=> nil 

1e3   #=> 1000.0 
str = '1e3' 
str.to_i  #=> 1 
int1(str)  #=> nil 
int2(str)  #=> nil 

str = '-1e3' 
str.to_i  #=> -1 
int1(str)  #=> nil 
int2(str)  #=> nil 

str = '- 1e3' 
str.to_i  #=> 0 
int1(str)  #=> nil 
int2(str)  #=> nil 

str = '3a' 
str.to_i  #=> 3 
int1(str)  #=> nil 
int2(str)  #=> nil 

str = '1-3a' 
str.to_i  #=> 1 
int1(str)  #=> nil 
int2(str)  #=> nil 

str = 'b3' 
str.to_i  #=> 0 
int1(str)  #=> nil 
int2(str)  #=> nil 

String#to_i lesen Ziffern (möglicherweise durch ein Minuszeichen), bis er ein Leerzeichen oder erreicht das Ende der Zeichenfolge liest. Es konvertiert dann nur diese Ziffern und mögliche Minuszeichen in eine Fixnum, die es zurückgibt. to_i hat sicher seinen Nutzen, aber diese Beispiele zeigen, dass Sie int1 oder int2 verwenden sollten, wenn Sie es wünschen nil zurück, wenn die Zeichenfolge nicht die Darstellung einer ganzen Zahl enthält.

Verwandte Themen