使用正则表达式解析数字

时间:2013-03-11 15:07:45

标签: ruby regex parsing

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

4 个答案:

答案 0 :(得分:5)

要添加逗号,您可以试试这样的内容:

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

然后将所有匹配项替换为\1,

因此:

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

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

例如以上示例中的第一个2后面跟着3个组:345512312。第一个5后跟两个群组:512312等。

不确定您是否能够在同一个正则表达式中添加$

答案 1 :(得分:2)

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

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

虽然可能是这种东西的宝石

答案 2 :(得分: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来实现。

答案 3 :(得分: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