如果浮点组件不是.00 sprintf / printf,则仅显示小数点

时间:2009-05-08 03:08:21

标签: ruby floating-point printf

我很喜欢格式化一个浮点数,但是如果没有相关的浮点数则希望它显示为整数。

  • 1.20 - > 1.2倍
  • 1.78 - > 1.78x
  • 0.80 - > 0.8倍
  • 2.00 - > 2×

我可以通过一些正则表达式实现这一点,但想知道是否有sprintf - 这样做的唯一方法是什么?

我在红宝石中懒得像这样:

("%0.2fx" % (factor / 100.0)).gsub(/\.?0+x$/,'x')

8 个答案:

答案 0 :(得分:48)

您想使用%g代替%f

"%gx" % (factor / 100.00)

答案 1 :(得分:27)

你可以像这样混合搭配%g和%f:

"%g" % ("%.2f" % number)

答案 2 :(得分:17)

如果你正在使用rails,你可以使用rails的NumberHelper方法: http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html

number_with_precision(13.001, precision: 2, strip_insignificant_zeros: true)
# => 13
number_with_precision(13.005, precision: 2, strip_insignificant_zeros: true)
# => 13.01

注意,因为精确意味着在这种情况下小数点后面的所有数字。

答案 3 :(得分:6)

我最终得到了

price = price.round(precision)
price = price % 1 == 0 ? price.to_i : price.to_f

这样你甚至可以获得数字而不是字符串

答案 4 :(得分:3)

我刚刚遇到过这个,上面的修复工作没有用,但我想出了这个,这对我有用:

def format_data(data_element)
    # if the number is an in, dont show trailing zeros
    if data_element.to_i == data_element
         return "%i" % data_element
    else
    # otherwise show 2 decimals
        return "%.2f" % data_element
    end
end

答案 5 :(得分:3)

这是另一种方式:

decimal_precision = 2
"%.#{x.truncate.to_s.size + decimal_precision}g" % x

或者作为一个很好的单行:

"%.#{x.truncate.to_s.size + 2}g" % x

答案 6 :(得分:2)

使用Rails轻松:http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_with_precision

number_with_precision(value, precision: 2, significant: false, strip_insignificant_zeros: true)

答案 7 :(得分:-2)

我正在寻找一个函数来截断(非近似)Ruby on Rails中的浮点数或十进制数,我找出了以下解决方案:

你们可以在你的控制台中尝试,例如:

>> a=8.88
>> (Integer(a*10))*0.10
>> 8.8

我希望它对某人有所帮助。 : - )