我经常搜索以获得float
值的确切要求,而小数点后没有不需要的零。
Eg: 14.0 should be 14
14.1 should be 14.1
到目前为止我找到的最近可能的解决方案是使用sprintf()
:
irb(main):050:0> num = 123.0
=> 123.0
irb(main):051:0> sprintf('%g', num)
=> "123"
此处的问题是我的num
类型已从String
更改为Float
。
我可以在不改变类型的情况下获得浮点值变化吗?
答案 0 :(得分:7)
尝试:
class Float
def try_integer
to_i == self ? to_i : self
end
end
14.2.try_integer #=> 14.2
14.0.try_integer #=> 14
答案 1 :(得分:6)
14.0.tap{|x| break x.to_i == x ? x.to_i : x}
# => 14
14.1.tap{|x| break x.to_i == x ? x.to_i : x}
# => 14.1
答案 2 :(得分:2)
我通过Sawa和BroiSatse的回答得到了答案。
但我想以下就足以得到我所要求的:
irb(main):057:0> num = 14.0
=> 14.0
irb(main):058:0> num = num == num.to_i ? num.to_i : num
=> 14
irb(main):059:0> num = 14.1
=> 14.1
irb(main):060:0> num = num == num.to_i ? num.to_i : num
=> 14.1
答案 3 :(得分:1)
您是否会要求浮点值的整数部分?
123.0的整数部分是123,而156.78的整数部分是156。
如果是这样,那就是:
2.1.0 :001 > 123.0.to_i
=> 123
2.1.0 :002 > 156.7.to_i
=> 156
答案 4 :(得分:1)
我会建议像
这样的东西class Float
def custom_format(num)
num.round(0) == num ? num : num.round(1)
end
end
13.1.custom_format #=> 13.1
13.7.custom_format #=> 13.7
13.0.custom_format #=> 13
答案 5 :(得分:1)
我想向Numeric
父类添加一个方法,以便此方法也可以与Integer(Fixnum)数一起使用。使用==
进行比较,因为在比较之前不进行类型转换。
class Numeric
def slim(places = nil)
truncate == self ? truncate : places.nil? ? self : round(places)
end
end
答案 6 :(得分:0)
假设您要删除零,只有当它包含纯零并以其他方式返回原始值时,我会这样做
num = 123.00
(num.to_s.scan(/[.]\d+/)[0].to_f > 0) ? num : num.to_i #=> 123
num = 123.45
(num.to_s.scan(/[.]\d+/)[0].to_f > 0) ? num : num.to_i #=> 123.45
答案 7 :(得分:0)
更具描述性:
number = 14.0
BigDecimal.new(number.to_s).frac.zero? ? number.to_i : number
# => 14
number = 14.1
BigDecimal.new(number.to_s).frac.zero? ? number.to_i : number
# => 14.1