在ruby中,我想将float转换为int,如果它是一个整数。例如
a = 1.0
b = 2.5
a.to_int_if_whole # => 1
b.to_int_if_whole # => 2.5
基本上我试图避免在任何没有小数的数字上显示“.0”。我正在寻找一种优雅(或内置)的方式来做
def to_int_if_whole(float)
(float % 1 == 0) ? float.to_i : float
end
答案 0 :(得分:49)
一个简单的方法是:
class Float
def prettify
to_i == self ? to_i : self
end
end
那是因为:
irb> 1.0 == 1
=> true
irb> 1 == 1.0
=> true
然后你可以这样做:
irb> 1.0.prettify
=> 1
irb> 1.5.prettify
=> 1.5
答案 1 :(得分:47)
单线冲刺......
sprintf("%g", 5.0)
=> "5"
sprintf("%g", 5.5)
=> "5.5"
答案 2 :(得分:5)
这是最终以我想要的方式工作的解决方案:
class Float
alias_method(:original_to_s, :to_s) unless method_defined?(:original_to_s)
def is_whole?
self % 1 == 0
end
def to_s
self.is_whole? ? self.to_i.to_s : self.original_to_s
end
end
这样我可以根据需要更新is_whole?
逻辑(我似乎tadman是最复杂的),它确保Float输出到字符串的任何地方(例如,在表单中)它出现的方式我希望它(即最后没有零)。
感谢大家的意见 - 他们真的很有帮助。
答案 3 :(得分:3)
我对Ruby不太了解。
但这是一个显示问题。如果您使用的库在将数字转换为字符串时无法格式化数字,我会非常惊讶。
可能没有一个全能格式化选项可以完全按照您的要求进行操作,但是如果float是整数的浮点表示,则可以设置一个返回true的方法,否则返回false。在您创建的格式化例程中(因此您只需要在一个位置执行此操作)只需根据此格式更改格式为true或false。
This讨论了如何控制显示数字时小数点后出现的位数。
注意浮点表示的复杂性。数学可能会说答案是3但你可能得到3.000000000000000000001。我建议使用delta来查看数字是否几乎是整数。
答案 4 :(得分:2)
虽然我倾向于同意上述帖子,但如果你必须这样做:
(float == float.floor) ? float.to_i : float
答案 5 :(得分:2)
如果您使用的是rails,则可以使用带有选项number_to_rounded
的帮助strip_insignificant_zeros
,例如:
ActiveSupport::NumberHelper.number_to_rounded(42.0, strip_insignificant_zeros: true)
或者像这样:
42.0.to_s(:rounded, strip_insignificant_zeros: true)
答案 6 :(得分:1)
这是我为教育目的提供的可怕的实施方法:
class Float
def to_int_if_whole(precision = 2)
("%.#{precision}f" % self).split(/\./).last == '0' * precision and self.to_i or self
end
end
puts 1.0.to_int_if_whole # => 1
puts 2.5.to_int_if_whole # => 2.5
puts 1.9999999999999999999923.to_int_if_whole # => 2
使用sprintf样式调用的原因是它比Float#round方法更可靠地处理浮点近似。
答案 7 :(得分:0)
我对Ruby也不太了解。
但是在C ++中,我会这样做:
bool IsWholeNumber( float f )
{
const float delta = 0.0001;
int i = (int) f;
return (f - (float)i) < delta;
}
然后我根据它格式化输出精度。