如何在Ruby中每3个小数位后格式化float?

时间:2014-01-01 16:54:36

标签: ruby floating-point formatting printf

是否可以使用Ruby数字格式(例如sprinf或其他?)来格式化每3个小数位后带空格的浮点数?

1.5         => 1.5
1.501       => 1.501
1.501001    => 1.501 001
1.501001001 => 1.501 001 001

还有另一种简单的方法吗?

使用Ruby工作, 而不是Rails

4 个答案:

答案 0 :(得分:3)

我不相信对此有任何内置支持,但您可以更改Float#inspectFloat#to_s的行为,如下所示:

class Float
  alias :old_inspect :inspect
  def inspect
     pieces = old_inspect.split('.')
     if pieces.length == 1
       pieces[0]
     else
       pieces[1].gsub!(/(...)(?!$)/,'\1 ')
       pieces.join('.')
     end
  end
  alias :to_s :inspect
end

注意:我只对其进行了最低限度的测试,并且在Ruby字符串操作方面有一些更优雅的方法来编写代码。这也会带来很大的风险,这会破坏依赖于传统浮动格式的代码。

答案 1 :(得分:2)

使用String方法:

def add_sep(s, n=3, sep=' ')
  s.split('').each_slice(n).map(&:join).join(sep)
end

def add_spaces(fl)
  f, l = fl.to_s.split('.')
  f + '.' + add_sep(l)
end  

add_spaces(1.5)         # => "1.5"
add_spaces(1.501)       # => "1.501"
add_spaces(1.50101)     # => "1.501 01"
add_spaces(1.501011)    # => "1.501 011"
add_spaces(1.501001001) # => "1.501 001 001"

def add_spaces_both_sides(fl)
  f, l = fl.to_s.split('.')
  add_sep(f.reverse).reverse + '.' + add_sep(l)
end  

add_spaces_both_sides(1234567.12345) # => "1 234 567.123 45" 

答案 2 :(得分:1)

您可以通过打开Float类并添加以下方法来完成此操作:

class Float
  def format_spaced
    parts = self.to_s.split(".")
    parts[0] + "." + parts[1].scan(/\d{1,3}/).join(" ")
  end
end

f = 1.23456789
f.format_spaced  # => "1.234 567 89"

我希望相当直白!

答案 3 :(得分:0)

它在技术上是rails的一部分,但你可以从数字帮助器中获取一些代码。即number_with_delimiter

number_with_delimiter(98765432.98, delimiter: " ", separator: ",")
# => 98 765 432,98

http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html#method-i-number_with_delimiter

它的内容在NumberToRoundedConverter class