如何改进正则表达式以消除不必要的方法链接?

时间:2014-02-19 20:46:21

标签: ruby regex methods refactoring

此函数方法接受一个数字并返回用逗号分隔的相同值,这是美国的常见惯例。

我能用它来使用正则表达式的唯一方法是在表达式之前和之后反转字符串。是否有正则表达式可以帮助我消除为方法功能调用String#reverse两次的需要?

def separate_comma(number)
  raise "You must enter a number." if number.is_a?(Numeric) == false
  number.to_s.reverse.gsub(/(\d{3})(?=\d{1,3})/, "\\1,").reverse
end

3 个答案:

答案 0 :(得分:1)

其他图书馆已经解决了这个问题 - ActiveSupport一个。

require "active_support/number_helper"
ActiveSupport::NumberHelper.number_to_delimited(1234567890)
#=> "1,234,567,890"

如果您愿意,甚至可以更改分隔符:

ActiveSupport::NumberHelper.number_to_delimited(1234567890, delimiter: "|")
#=> "1|234|567|890"

答案 1 :(得分:0)

"1234556".gsub(/\d(?=\d{3}+\b)/,'\\0,')
# => "1,234,556"

这不能处理长的小数值,但这也不是OP的正则表达式所关注的问题。

答案 2 :(得分:0)

确定的方法是:

string.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")

如果你想用浮动来做:

string.gsub(/(?<=\d)(?=(?:\d{3})+[.\z])/, ",")