2012-04-26 98 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