2014-07-27 28 views
30

'a dönüştürün Web programlama için sayılar dizgiler olarak gelir. Ancak to_i, her iki yanlış yanıt için "5abc" ve 5 ve "abc" için 0 dönüştürecektir. Bu yakalamak için, ben yazdım:Dizgeyi tamsayı (veya sıfır)

def number_or_nil(s) 
    number = s.to_i 
    number = nil if (number.to_s != s) 
    return number 
end 

daha düzgün bu dönüşümü gerçekleştirmek ve dize bir sayı olarak amaçlı olmadığını tespit, daha Yakut doğal bir yolu var mı?

+0

'' 5 ''' 5 'veya' nil' olmalıdır? –

+0

Soru açık değil. To_i ile ilgili sorun nedir? "Bu dönüşüm" nedir? – sawa

+0

nil ben bekleyebilirim, ancak 5 ile yaşayabilirim. –

cevap

56

Kullanım Tamsayı dize bir tamsayıya dönüştürmek olamaz eğer bir ArgumentError hatası yükseltecektir

(dize). Eğer davranış dize dönüştürülemez zaman o nil döndürülür olmak istiyorsanız

Integer('5abc') #=> ArgumentError: invalid value for Integer(): "5abc" 
Integer('5') #=> 5 

Hala number_or_nil yöntemini gerekiyordu.

def number_or_nil(string) 
    Integer(string || '') 
rescue ArgumentError 
    nil 
end 

Belirli bir istisnadan kurtarmaya dikkat etmelisiniz. Çıplak bir kurtarma ("kurtarma nil" gibi), StandardError'dan devralınan herhangi bir hatayı kurtarır ve beklemediğiniz şekilde programınızın yürütülmesine müdahale edebilir. Tamsayı() bir ArgumentError artacak, bunu belirtin. Eğer

ziyade özel başa değil ve sadece örtülü dönüş değerleri yararlanmak ve olarak yazabilir senin number_or_nil daha kısa bir versiyonunu tercih ediyorsanız: Bu beklediğiniz gibi çalışacaktır

def number_or_nil(string) 
    num = string.to_i 
    num if num.to_s == string 
end 

number_or_nil '5' #=> 5 
number_or_nil '5abc' #=> nil 

.

+3

Sadece uyarı 'Tamsayı (nil) 'TürError'ı yükseltir,' Tamsayı (string || '')' daha tutarlıdır. – RocketR

+0

İyi nokta @RocketR! –

+1

"Tamsayı (dize)" için (resmi) belgeleri nerede bulabilirim? Görebildiğim kadarıyla resmi [ruby 'Integer' belgelerinde] hiç bir söz yok (http://ruby-doc.org/core-2.2.3/Integer.html). – apepper

0

str'un tam sayı olup olmadığını kontrol etmek için basit bir normal ifade kullanın.

def number_or_nil(str) 
    str.to_i if str[/^-?\d+$/] and str.line.size == 1 
end 
+0

Girdiden web geldiği için cevabınızı çok satır içeriği str.to_i str ise [/ \ A \ d + \ z /] –

+0

Negatif tam sayı, boşluk mu? –

+0

Sabit. Kontrol et tamsayılar, boşluklar, yeni satırlar için katı kurallar bekler. – hakcho