Ruby 如何改进regex以消除不必要的方法链接?

Ruby 如何改进regex以消除不必要的方法链接?,ruby,regex,methods,refactoring,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}

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

我能让它与正则表达式一起工作的唯一方法是反转表达式前后的字符串。是否有一个正则表达式可以帮助我消除调用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

其他库已经解决了这个问题-
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"

这不处理长分数值,但OP的正则表达式也不关心这一点。

实现这一点的既定方法是:

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

string.gsub(/(?给出输入和期望的输出)您也可以使用此正则表达式来代替:
/(\d)(?=(\d\d\d)+(?!\d))/
(取自@ZachKemp如果数字超过3位小数,正则表达式将崩溃。不过,对于OP来说可能不是问题。
1234.5678.gsub(/(\d)(?=(\d\d\d)+(?!\d))/,“\\1”)>“1234.5678”<代码> >代码> ActudioPuxPo/<代码>在“代码> GSUB/CODE >被调用之前先将分隔符上的编号拆分。杰伊,出于文体原因(仅),考虑<代码>提高“您必须输入一个数字”。除非数字。ISSa(数字)< /代码>。这对于整数是有效的,但对于任何浮点数,如货币,它都不起作用。
string.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")
string.gsub(/(?<=\d)(?=(?:\d{3})+[.\z])/, ",")