是否可以使用Ruby数字格式(例如sprinf或其他?)来格式化每3个小数位后带空格的浮点数?
1.5 => 1.5
1.501 => 1.501
1.501001 => 1.501 001
1.501001001 => 1.501 001 001
还有另一种简单的方法吗?
使用Ruby工作, 而不是Rails 。
答案 0 :(得分:3)
我不相信对此有任何内置支持,但您可以更改Float#inspect
和Float#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