8

这似乎是一个简单的,但我错过了一些东西。

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

数字输入

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 正在捕获所有内容,而不仅仅是 () 中的逗号。我哪里错了?

4

3 回答 3

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

仅当后面正好是三个数字时才删除逗号。

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

于 2013-01-30T21:22:38.023 回答
1

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

尝试

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

inputstr.gsub(myregex,'\1\2')
于 2013-01-30T21:24:56.457 回答
0

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

但是,我可以给出一个字符串,也可以123,456不给出123.456任何上下文。分不清是“12.3万456”还是“123点456”。

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

您可能还想查看Wikipedia 上的这篇文章,了解指定分隔符或小数点的不太常见的方法。知道并决定不支持比假设事情会奏效要好。

于 2013-01-30T21:41:37.643 回答