2012-01-31 86 views
2

我想在Ruby中实现下面的代码,并陷入它。什么是Ruby的substr等价物?

我看过文档,但它们都处理字符串而不是对象。

PHP代码:

if (substr($new_price, -2) != '00') { 

Ruby代码我想:

if new_price[-2,2] != '00' 
if new_price.to_s.slice[-2,2] != '00' 

编辑:

对于目前的使用情况,这只是为了检查,看是否有价格上具有小数或不,我转到这个:

if new_price.ceil != new_price 

我仍然好奇如何在Ruby中正确执行此操作。

+1

如果它是一个对象,操作上该对象的* *财产。不要依赖可能会改变的任意'to_s'实现。 – 2012-01-31 17:29:32

+0

我以为Ruby把所有东西看作是一个对象?在PHP中,我只是称之为变量 – 2012-01-31 18:10:26

+1

Everything *是*一个对象,包括字符串。切割任意物体是没有意义的。切一个'to_s'表示是有风险的,因为它可能会改变。如果'new_price'是一个字符串,则可以使用数组符号切片'[n1..n2]'。如果它是某种其他类型,则应该对其关心的任何部分进行操作,或者重新定义其“切片”方法和/或其[']'运算符。这两个可怕的想法,因为不传达你实际在做什么,这是获得价格的美分部分。 – 2012-01-31 18:41:31

回答

4

在Ruby中,你可以得到一个字符串的最后两个元素与(例如)这样的代码:

price = '200' 
puts price[-2..-1] 
#=> 00 

你也该last(n)方法添加到字符串类如下:

class String 
    def last(n) 
    self[-n..-1] || self 
    end 
end 

然后你可以这样写代码:

puts price.last(2) 
#=> 00 

puts price.last(100) 
#=> 200 
+0

我可以做到这一点,如果我明确说明字符串,但对象呢? – 2012-01-31 18:09:18

+0

'price'是我们例子中'String class'的一个实例 - 这意味着您将获得将要创建/创建的任何String实例的最后一个方法(例如,name =“”,description =“”等) 。虽然在具体对象上定义'last'方法可以通过单例方法('def price.last(n) self [-n ..- 1] || self end'),但它没有任何意义在我们的例子中 - 你不能在任何其他字符串实例上调用它,只有唯一的价格实例... – maprihoda 2012-01-31 18:39:50

+0

@DougMcK分割任意对象是没有意义的。你可以在任何你想要的课程上重新定义“切片”,但它非常不可交流,并且违反直觉。 – 2012-01-31 18:42:30

0

尝试:

if new_price.to_s.slice(-2, 2) != '00' 
+0

已经做到了!虽然用[]而不是() – 2012-01-31 17:59:06

+1

[]和()会做2个完全不同的东西 – 2012-01-31 18:32:22

2
unless new_price.to_s.end_with?('00') 
相关问题