class Numeric
def evenize(round="+")
eval "self #{round} (self.modulo(2))"
end
end
177.evenize
#=> 178
177.evenize("-")
#=> 176
Refactorings
No refactoring yet !
scottburton11
November 18, 2009, November 18, 2009 03:23, permalink
Only slightly less evil.
class Numeric
def evenize(round="+")
instance_eval "self #{round} (self.modulo(2))"
end
end
danielharan
November 18, 2009, November 18, 2009 04:38, permalink
I'd define floor_even and ceil_even, then round_even if needed. It's more lines of code, but I think it's easier all around.
Adam
November 18, 2009, November 18, 2009 06:02, permalink
class Numeric
def evenize(operator = '+')
raise ArgumentError, "invalid argument (must be `+' or `-')" unless %w(+ -).include?(operator)
round.send(operator, modulo(2))
end
end
scottburton11
November 18, 2009, November 18, 2009 09:35, permalink
I like that.
For what it's worth, here's #oddize
class Numeric
def oddize(operator = '+')
raise ArgumentError, "invalid argument (must be `+' or `-')" unless %w(+ -).include?(operator)
self %2 > 0 ? self : round.send(operator, 1)
end
end
Muke Tever
November 23, 2009, November 23, 2009 00:21, permalink
The above don't seem to handle fractions, as I assume you might want, given it's being attached to Numeric and not, say, Integer.
I agree with danielharan about separating evenizing upwards from evenizing downwards, if only because passing "+" or "-" is arbitrary based on the implementation. But you wanted a different way, so:
class Numeric
def evenize_ceil
self.quo(2).ceil * 2
end
def evenize_floor
self.quo(2).floor * 2
end
def oddize_ceil
(self - 1).evenize_ceil + 1
end
def oddize_floor
(self - 1).evenize_floor + 1
end
# if you insist
def evenize(upwards = true)
upwards ? evenize_ceil : evenize_floor
end
def oddize(upwards = true)
upwards ? oddize_ceil : oddize_floor
end
# Bonus methods - round to the nearest even or odd number.
def evenize_round
(self + 1).evenize_floor
end
def oddize_round
(self + 1).oddize_floor
end
end
It almost feels stupid to do this. Is there another way to round up/down to the nearest even number?