有没有办法让rails打印出一个带逗号的数字?
例如,如果我的号码为54000000.34,我可以运行<%= number.function%>,这将打印出“54,000,000.34”
谢谢!
答案 0 :(得分:329)
您需要number_with_delimiter
方法。例如:
<%= number_with_delimiter(@number, :delimiter => ',') %>
或者,您可以使用number_with_precision
方法确保数字始终以两位小数位数显示:
<%= number_with_precision(@number, :precision => 2, :delimiter => ',') %>
答案 1 :(得分:119)
对于不使用rails的人:
number.to_s.reverse.gsub(/(\d{3})(?=\d)/, '\\1,').reverse
答案 2 :(得分:27)
是的,请使用NumberHelper。您要查找的方法是number_with_delimiter。
number_with_delimiter(98765432.98, :delimiter => ",", :separator => ".")
# => 98,765,432.98
答案 3 :(得分:20)
如果要在视图外添加逗号而不想包含某些模块,可以使用number_to_delimited方法(rails version&gt; = 4.02)。例如:
#inside anywhere
ActiveSupport::NumberHelper.number_to_delimited(1000000) # => "1,000,000"
答案 4 :(得分:18)
如果你做了很多,但是因为上面没有暗示它也是FYI,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
如果您采用最典型的方式,则无需提供分隔符值。
答案 5 :(得分:14)
执行此操作的直接方式with or without Rails是:
{{1}}
有关更多选项,请参阅Active Support Core Extensions - Numeric - Formatting。
答案 6 :(得分:11)
对于那些不使用处理小数的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)+)
匹配一个数字,后跟一个或多个3位数组。第一组parens是我们的\1
捕获组,第二组是\2
。如果我们只是将它留在那,我们会得到:
123456.gsub!(/(\d)(?=(\d\d\d)+)/, "\\1,") #=> 1,2,3,456
这是因为1234场比赛,2345场比赛和3456场比赛所以我们在1,2和3之后放了一个逗号。(\d)(?=(\d\d\d)+(?!\d))
表示匹配一个数字,后面跟着一个数字后跟一个数字。这样做的原因是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
答案 7 :(得分:2)
另一种不使用Helpers的解决方案:格式有2个小数位,然后替换。通过,
puts(("%.2f" % 2.5666).gsub('.',','))
>> 2,57
答案 8 :(得分:1)
for javascript folks
function numberWithDelimiter(value) {
return (value+"").split("").reverse().join("").replace(/(\d{3})(?=\d)/g, '$1,').split("").reverse().join("")
}
:)
答案 9 :(得分:1)
您可以使用ActiveSupport
例如:
ActiveSupport::NumberHelper::number_to_currency(10000.1234,{precision: 2,unit: ''})
答案 10 :(得分:1)
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更高的数字
答案 11 :(得分:0)
新语法
number_with_delimeter(@number, delimeter: ",")
如果您想用德米特币来赚钱,那可以
number_to_currency(@number)
这也将添加$
。如果您使用的是money
宝石,那么可以
Money.new(@number,"USD").format
这也会放$
。
答案 12 :(得分:0)
以下方法可以同时实现定界符和精度(API ref)。
ActiveSupport::NumberHelper.number_to_rounded(1234.532, delimiter: ',', precision: 1)
(或仅从视图number_to_rounded
开始,无需后缀)
HTH
答案 13 :(得分:0)
在处理 Rails 6 应用程序时,我遇到了这个挑战。
如果数字是用于商品的价格或与货币有关,则可以使用number_to_currency
ActionView帮助器
此处是操作方法:
number_to_currency("123456789") # => $123456789
number_to_currency(1234567890.50) # => $1,234,567,890.50
number_to_currency(1234567890.506) # => $1,234,567,890.51
number_to_currency(1234567890.506, precision: 3) # => $1,234,567,890.506
number_to_currency(1234567890.506, locale: :fr) # => 1 234 567 890,51 €
number_to_currency(1234567890.50, unit: '₦', delimiter: ',', precision: 0) # => ₦1,234,567,890
number_to_currency(1234567890.50, unit: "R$", separator: ",", delimiter: "") # => R$1234567890,50
您可以在Rails文档中进一步了解它:number_to_currency
仅此而已。
我希望这会有所帮助