Ruby 使用正则表达式解析数字

Ruby 使用正则表达式解析数字,ruby,regex,parsing,Ruby,Regex,Parsing,我想取一个数字并将其格式化为price(字符串)。例如,我想拿250000美元,展示250000美元。如何使用regex实现这一点 要添加逗号,您可以尝试以下方法: /(\d)(?=(?:\d{3})+$)/ 然后将每个匹配项替换为\1, 因此: "12345512312".gsub(/(\d)(?=(?:\d{3})+$)/,'\1,') => "12,345,512,312" 这将匹配任何数字,后跟任意数量的3位数组 例如上例中的第一个2后面跟着3组:345、512和312。第一

我想取一个数字并将其格式化为price(字符串)。例如,我想拿250000美元,展示250000美元。如何使用regex实现这一点

要添加逗号,您可以尝试以下方法:

/(\d)(?=(?:\d{3})+$)/
然后将每个匹配项替换为
\1,

因此:

"12345512312".gsub(/(\d)(?=(?:\d{3})+$)/,'\1,')  => "12,345,512,312"
这将匹配任何数字,后跟任意数量的3位数组

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


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

要添加逗号,可以尝试以下方法:

/(\d)(?=(?:\d{3})+$)/
然后将每个匹配项替换为
\1,

因此:

"12345512312".gsub(/(\d)(?=(?:\d{3})+$)/,'\1,')  => "12,345,512,312"
这将匹配任何数字,后跟任意数量的3位数组

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

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

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

对于这类事情,可能有一块宝石,不过试试这个(免责声明-不是正则表达式):


这类东西可能是一块宝石,尽管与regex匹配,这是一件痛苦的事情!在这种情况下,因为正则表达式引擎从字符串的开头开始匹配,而不是从字符串的结尾开始匹配(查找从字符串末尾开始向后的3位模式)。我建议你要么这样做:

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

format_int['2500600'] => "$2,500,600"
。。。使用(这可能有点棘手),或者,如您所愿:
我错了,它可以用regex实现,如图所示。

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

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

format_int['2500600'] => "$2,500,600"
。。。使用(这可能有点棘手),或者,如您所愿:
我错了,它可以用regex实现,如图和所示。

您应该使用
number\u to\u 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 £

有关更多信息,请查看您应该使用
number\u to\u 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 £

有关更多信息,请查看AFAIK,正则表达式不能循环。你保证数字的上限吗?是的。假设数字是有界的。那么,$999999是一个可接受的上限吗?要输入逗号,您需要知道数字的数量,这不能用regex only实现。好的,regex不能循环。你保证数字的上限吗?是的。假设数字是有界的。那么,$999999是一个可接受的上限吗?要输入逗号,您需要知道数字的数量,这不能仅用正则表达式来实现。这是一个更干净的解决方案这是一个更干净的解决方案您介意解释一下
?:
是如何工作的吗?严格来说,
?:
不是必需的,它所做的只是将分组
\d{3}
作为一个被动组(意味着不创建反向引用)。我们需要将其设置为一个组,因为我们希望匹配一个或多个出现的
\d{3}
。我们本可以做
(\d{3})+
,但是
\2
会反向引用匹配的数字。在这种情况下,这没有什么区别,但它让我们在使用被动组时更清晰,意图更清晰。你介意解释一下
?:
是如何工作的吗?严格来说,
?:
不是必需的,它所做的只是将分组
\d{3}
作为一个被动组(意味着不创建反向引用)。我们需要将其设置为一个组,因为我们希望匹配一个或多个出现的
\d{3}
。我们本可以做
(\d{3})+
,但是
\2
会反向引用匹配的数字。在这种情况下,这没有什么区别,但它让我们在使用被动群体时更清晰,意图更清晰。