1

我有一个CSV::Table包含许多列的对象。每列由一定数量的元素组成,这些元素是应该包含数字的字符串。

它可以同时使用"."","用作小数分隔符,并且不能有任何千位分隔符

有效示例

  • “1023.12”
  • “2341,34”
  • “1245”
  • "1.456" - 注意它似乎是一个千位分隔符,没有小数大小写,但在这种情况下,它应该被解释为小数分隔符
  • “1,435” - 与上述相同的观察结果

无效示例

  • “1,434.12”
  • “1.455,19”
  • "1.499e5" - 科学记数法
  • "a134" - 只是为了确保字符串中没有字符

另外,我需要确保小数点分隔符在所有列和行中都是一致的;所以我需要提取使用的小数分隔符(","".")。

我可以使用什么正则表达式来检查字符串的有效性并提取小数点分隔符以检查整个表的一致性?

4

2 回答 2

3

我想这会起作用:

/^\d*([.,]?)\d+$/

这也将允许像 一样的数字.1234,即使它们不寻常也是有效的。

要禁止此类数字,请尝试添加另一对括号:

/^\d+(([.,])\d+)?$/

(请注意,现在第二对括号,而不是第一对,包含您的小数分隔符。)

于 2013-04-04T14:35:51.057 回答
0
matches = table.flat_map { |r| r.map { |c| /\A\d+(?:([.,])\d+)?\z/.match(c) } }
raise 'InvalidNumbers' if matches.any?(&:nil?)
decimals = matches.map{|m| m[1]}.reject(&:empty?).uniq
raise 'InconsistentDecimals' if decimals.size > 1
decimal_seperator = decimals.first || '.'

正则表达式匹配有效数字,在 match[1] 中捕获可选的小数分隔符。如果任何匹配失败(不是数字),则会出错。如果存在不止一种分隔符(不一致),则会出错。如果没有分隔符,假设 '.' 默认。

于 2013-04-04T16:02:20.660 回答