2012-04-26 84 views
5

是否存在一個Ruby方法,它接受一個字符串和一個默認值,並在字符串表示整數或者返回默認值時將其轉換爲整數?將Ruby字符串轉換爲具有默認值的整數

更新 我認爲下面的回答最好:

class String 
    def try_to_i(default = nil) 
    /^\d+$/ === self ? to_i : default 
    end 
end 

這是證據,爲什麼你應該避免異常:

> def time; t = Time.now; yield; Time.now - t end 

> time { 1000000.times { |i| ('_' << i.to_s) =~ /\d+/ } } 
=> 1.3491532 
> time { 1000000.times { |i| Integer.new('_' << i.to_s) rescue nil } } 
=> 27.190596426 
+0

你是什麼意思的「包含整數」? – 2012-04-26 11:42:22

+0

'「不成熟的優化是一切罪惡的根源」 - Donald Knuth – Reactormonk 2012-04-27 08:28:06

回答

2

你將不得不編寫一個自己,可能使用正則表達式來檢查字符串:

def try_to_i(str, default = nil) 
    str =~ /^-?\d+$/ ? str.to_i : default 
end 
+0

那麼負數呢? – Reactormonk 2012-04-27 08:31:02

+0

@Tass:感謝您指出:) – 2012-04-27 12:36:00

8

#to_iInteger()進行轉換。第一個默認爲 0,第二個引發ArgumentError。

class String 
    def to_integer(default) 
    Integer(self) 
    rescue ArgumentError 
    default 
    end 
end 
+0

我認爲對正常使用情況使用異常會導致性能開銷太高 – Alexey 2012-04-26 15:10:37

+0

我不得不同意這是更優雅的解決方案,應該被接受。我只是沒有提出這個建議,因爲我不知道'Integer()'。 @Alexey:爲作業使用正則表達式的開銷更加有問題。 – 2012-04-26 16:40:03

+0

Niklas,請參閱 – Alexey 2012-04-26 22:27:37

-1

你可以做這樣的事情:

int_value = (stringVar.match(/^(\d+)$/) && $1.to_i) || default_value 

,將看到如果字符串的數字完全由,如果是的話,轉換成int或返回默認值。

+0

問題中的更新Ruby具有'?:',那麼爲什麼要使用不可靠的'&& ... || ......成語? – 2012-04-26 11:47:20

+0

國際海事組織,似乎在概念上更合理的捆綁整數大小寫成括號,而不是使用三元運算符。另外,&&/||如何不可靠?當然,如果你在他們的書面字等價操作符(或/和)之間切換,存在優先級問題,但一致的使用消除了這一點。所有這一切,都取決於你 - 如果三元符合你的風格,那就去做吧。 – 2012-04-26 11:50:09

+0

我的意思是,如果'&&'和'||'之間的部分可以變爲'false'或'nil',在這種情況下它不等同於條件運算符或'if ..那麼......其他「。在這種情況下可以,因爲'to_i'總是返回一個整數值。順便說一句,在你的例子中不需要括號。 – 2012-04-26 12:11:26