Answers:
您需要该number_with_delimiter
方法。例如:
<%= number_with_delimiter(@number, :delimiter => ',') %>
或者,可以使用该number_with_precision
方法来确保始终以两位小数精度显示数字:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
number_with_delimiter
过于复杂,而且速度非常慢,并且调用堆栈的深度很大。它曾经i18n
能够格式化人类和地球外文明已知的任何数字(或者即使您将其指定为参数,也可能只是选择一个,
或.
十进制数字)。它分配了成千上万个对象(因此其性能模式非常复杂且难以分析)。如果您不需要支持根据地区设置数字格式的其他方式,请考虑仅使用正则表达式。
对于不使用rails的任何人:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
number.to_s.reverse.scan(/(?:\d*\.)?\d{1,3}-?/).join(',').reverse
\1
不够?谢谢。
不管有没有Rails,这样做的直接方法是:
require 'active_support/core_ext/numeric/conversions'
12345.to_s(:delimited) # => "12,345"
12345.6789.to_s(:delimited) # => "12,345.6789"
有关更多选项,请参阅Active Support Core Extensions-数字格式。
ActiveSupport::NumberHelper.number_to_delimited
。这个答案值得更多的赞扬。
是的,使用NumberHelper。您正在寻找的方法是number_with_delimiter。
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
如果要在视图之外添加逗号,并且不想包括某些模块,则可以使用number_to_delimited方法(rails版本> = 4.02)。例如:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
如果您不仅要这样做,而且还想做很多事情,因为上面没有暗示,那么Rails会为该number_with_delimiter
方法提供合理的默认值。
#inside controller or view
number_with_delimiter(2444323.4)
#=> 2,444,323.30
#inside console
helper.number_with_delimiter(233423)
#=> 233,423
如果您以最典型的方式进行操作,则无需提供定界符值。
对于不使用会处理小数的rails的人来说,更好的方法是:
parts = number.to_s.split('.')
parts[0].gsub!(/(\d)(?=(\d\d\d)+(?!\d))/, "\\1,")
parts.join('.')
如果要使用其他定界符,请在正则表达式中更改最后一个','。
对于奖金,这是正则表达式的工作方式:
\\1
。在评估时\\1
变为\1
与正则表达式中的第一个捕获组匹配。在这个正则表达式中(\d)
。(\d)(?=(\d\d\d)+)
匹配一个数字,然后是1个或多个3位数字的组。第一组是我们的\1
捕获组,第二组是\2
。如果我们只保留它,则会得到:
123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456
这是因为1234个匹配项,2345个匹配项和3456个匹配项,所以我们在1、2和3后面加上逗号。(\d)(?=(\d\d\d)+(?!\d))
意味着匹配一个数字后跟3个数字,而后跟一个数字。之所以起作用,是因为gsub将继续替换与字符串匹配的内容。如果我们只打算替换第一个匹配项,那么对于123456789这样的数字,我们将得到123456,789。由于123456,789仍然与我们的正则表达式匹配,因此我们得到123,456,789。这是我得到代码的地方:https : //github.com/rails/rails/blob/master/activesupport/lib/active_support/number_helper.rb#L298-L300
在这里,我了解了该正则表达式中发生的情况:http : //www.tutorialspoint.com/ruby/ruby_regular_expressions.htm
{{ value | round | replace: "(\d)(?=(\d\d\d)+(?!\d))", "$1," | prepend: "$" }}
另一个不使用Helpers的解决方案:格式化2个小数位,然后替换。通过,
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
您可以使用以下方法 ActiveSupport
例如:
ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})
def add_commas(numstring)
correct_idxs = (1..100).to_a.select{|n| n % 6 == 0}.map{|n| n - 1}
numstring.reverse.chars.join(",").chars.select.with_index{|x, i| i.even? || correct_idxs.include?(i)}.join.reverse
end
这是我的红宝石方式
加法编辑:基本上,它会在数字之间添加所有逗号,并且仅选择索引+ 1%6的那些逗号
我认为逗号最多可以使用100,但是如果您想要一个超长的数字,只需将100设为一个更大的数字
新语法
number_with_delimeter(@number, delimeter: ",")
如果您想用德拉米特赚钱,那您可以做
number_to_currency(@number)
这也会增加$
。如果您使用money
宝石,则可以
Money.new(@number,"USD").format
这也会放$
。
ActionView::Helpers::NumberHelper
在模块中,您应该能够从模块中使用它。