1

我想取一个数字并将其格式化为价格(作为字符串)。例如,我想取 250000 并显示 $250,000。如何使用正则表达式完成此操作?

4

4 回答 4

5

要添加逗号,您可以尝试以下操作:

/(\d)(?=(?:\d{3})+$)/

然后将每个匹配替换为\1,.

像这样:

"12345512312".gsub(/(\d)(?=(?:\d{3})+$)/,'\1,')  => "12,345,512,312"

这将匹配任意数字后跟任意数量的 3 位组。

例如,上例中的第一个2后面跟着 3 个组345512312。第一个5后面是 2 组:512and312等。

不确定您是否可以$在同一个正则表达式中添加。

于 2013-03-11T15:28:52.520 回答
2

与正则表达式匹配,#@ 很痛苦!在这种情况下,因为正则表达式引擎从字符串的开头开始匹配,而不是结尾(查找从字符串结尾开始并向后移动的 3 位模式)。我建议要么做这样的事情:

format_int = ->(s) do
  str = s.reverse.scan(/\d{1,3}/).join(',').reverse
  "$#{str}"
end

format_int['2500600'] => "$2,500,600"

...使用Kernel#sprintf(这可能有点棘手)或者,如您所愿:我错了,可以使用正则表达式来实现,如herehere所示。

于 2013-03-11T15:31:04.420 回答
2

试试这个(免责声明 - 不是正则表达式):

def prettify(n)
  int, dec = n.to_s.split('.')
  int = int.reverse.scan(/.{1,3}/).join(',').reverse
  [int, dec].reject(&:empty?).join('.')
end

可能是这种东西的宝石

于 2013-03-11T15:29:30.143 回答
0

你应该使用number_to_currency helper

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("123a456")                        # => $123a456

number_to_currency("123a456", raise: true)           # => InvalidNumberError

number_to_currency(-1234567890.50, negative_format: "(%u%n)")
# => ($1,234,567,890.50)
number_to_currency(1234567890.50, unit: "£", separator: ",", delimiter: "")
# => £1234567890,50
number_to_currency(1234567890.50, unit: "£", separator: ",", delimiter: "", format: "%n %u")
# => 1234567890,50 £

有关更多信息,请查看http://api.rubyonrails.org/classes/ActionView/Helpers/NumberHelper.html

于 2013-12-20T20:49:30.723 回答