Ruby代码如何去除小数点后无意义的数字?

5

我希望得到一个优雅的代码,可以删除无关紧要的结尾零,例如:

29.970 => 29.97
29.97 => 29.97
25.00 => 25
25.0 => 25

我尝试过:

argument.to_r.to_f.to_s

但并不是在所有情况下都有效,例如25.00会变成25.0。

1
你试过使用这个convert方法吗?它适用于你提供的4种情况。 - Mike S
2个回答

15

当数字是字符串时,尾随零仅在其末尾起到意义:

def strip_trailing_zero(n)
  n.to_s.sub(/\.?0+$/, '')
end

strip_trailing_zero(29.970) # => "29.97"
strip_trailing_zero(29.97)  # => "29.97"
strip_trailing_zero(25.00)  # => "25"
strip_trailing_zero(25.0)   # => "25"

这将把传入的浮点数转换为字符串,然后使用简单的 sub 搜索和替换来修剪尾随的 0 和(可选地)小数点。

如果需要,您可以想出如何将它们转换回整数和浮点数。如果传递了整数/fixnum,则会删除有效的尾随零。如何防范这种情况也是您需要考虑的问题。


如果您传递整数,则它也会从整数值中删除0,因此不要传递整数值。 “20” => 2 - Iqbal Khan
由于这个程序的目的是从浮点数中去除尾随的零,因此它不应该接收一个整数。不过,这很容易进行保护。 - the Tin Man
4
你需要从正则表达式中删除问号。n.to_s.sub(/.0+$/, '') - Petran
1
这个不起作用 strip_trailing_zero(250) => "25" - Handsome Jack
当提问和回答的时候确实是这样。但 Ruby 已经改变了。 - the Tin Man
如果你正在使用Rails,你可以查看ActionView/Helpers/NumberHelper中的number_with_precision方法。 - undefined

8

尝试使用 sprintf('%g', value_here)

`g` ->  Convert a floating point number using exponential form
  | if the exponent is less than -4 or greater than or
  | equal to the precision, or in dd.dddd form otherwise.

https://apidock.com/ruby/Kernel/sprintf

sprintf('%g',29.970) # => "29.97"
sprintf('%g',29.97)  # => "29.97"
sprintf('%g',25.00)  # => "25"
sprintf('%g',25.0)   # => "25"

1
0变成-0,%g - K2xL
1
小心!看起来它能工作,但如果你传递21385524.0031,你会得到:2.13855e+07。 - Handsome Jack

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接