向大数字添加逗号是否有轨道技巧?

时间:2009-07-03 08:24:06

标签: ruby-on-rails ruby

有没有办法让rails打印出一个带逗号的数字?

例如,如果我的号码为54000000.34,我可以运行<%= number.function%>,这将打印出“54,000,000.34”

谢谢!

14 个答案:

答案 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('.')

如果你想要一个不同的分隔符,改变正则表达式中的最后一个','。

对于奖金,这就是正则表达式的工作方式:

  • gsub将所有与正则表达式匹配的内容替换为传递给gsub的第二个参数。在这种情况下是\\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)+(?!\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

这也会放$

number_with_delimiter

ruby money

number_to_currency

答案 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

仅此而已。

我希望这会有所帮助