Ruby(在Rails上)正则表达式:从数字中删除数千个逗号

时间:2013-01-30 21:17:58

标签: ruby regex ruby-on-rails-3

这看起来很简单,但我遗漏了一些东西。

我有许多来自各种来源和不同格式的输入。

号码输入

123
123.45
123,45 (note the comma used here to denote decimals)
1,234
1,234.56
12,345.67
12,345,67 (note the comma used here to denote decimals)

有关输入的其他信息

  • 数字总是少于100万
  • 编辑:这些是价格,所以要么是整数,要么是百分之一

我正在尝试编写一个正则表达式并使用gsub来删除数千个逗号。我该怎么做?

我写了一个正则表达式:myregex = /\d+(,)\d{3}/

当我在Rubular中测试它时,它显示它仅在我想要的测试用例中捕获逗号。

但是当我运行gsub时,我得到一个空字符串:inputstr.gsub(myregex,"")

看起来gsub正在捕获所有内容,而不仅仅是()中的逗号。我哪里错了?

3 个答案:

答案 0 :(得分:9)

result = inputstr.gsub(/,(?=\d{3}\b)/, '')

只有在正好跟随三位数时才会删除逗号。

(?=...)是一个先行断言:它需要可以在当前位置匹配,但它不会成为实际匹配(并随后被替换)的文本的一部分。

答案 1 :(得分:1)

您将“匹配”与“捕获”混淆:“捕获”意味着保存某些东西,以便您以后可以参考。您想要捕获的不是逗号,而是捕获其他所有内容,然后使用捕获的部分来构建替换字符串。

尝试

myregex = /(\d+),(\d{3})/

inputstr.gsub(myregex,'\1\2')

答案 2 :(得分:0)

在您的示例中,可能从最后一个分隔符(,.)后面的位数来判断它是小数点,因为有两个单独的数字。对于大多数情况,如果最后一组数字没有3位数,那么您可以假设前面的分隔符是小数点。另一个标志是大数字分隔符的多重出现允许我们区分小数点和分隔符。

但是,我可以在没有任何上下文的情况下提供字符串123,456123.456不可能判断它们是“123,000 456”还是“123 point 456”。

您需要扫描文档以查找是否,用于千位分隔符或小数点,反之亦然.。通过提供上下文,您可以安全地应用相同的方法来删除千位分隔符。

您可能还想查看维基百科上的this article,了解指定分隔符或小数点的不太常用的方法。知道并决定不支持比假设事情有效更好。