如何改进正则表达式以消除不必要的方法链接?
此函数方法接受一个数字并返回以逗号分隔的相同值,这是美国的常见惯例。
我可以让它与正则表达式一起工作的唯一方法是在表达式之前和之后反转字符串。 是否有正则表达式可以帮助我消除为方法function调用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
"1234556".gsub(/\d(?=\d{3}+\b)/,'\\0,') # => "1,234,556"
这不能处理长的小数值,但这也不是OP正则表达式的关注点。
其他库已经解决了这个问题 – 一个是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"
已建立的方法是:
string.gsub(/(?<=\d)(?=(?:\d{3})+\z)/, ",")
如果你想用浮点数做:
string.gsub(/(?<=\d)(?=(?:\d{3})+[.\z])/, ",")