正则表达式检查数字小数分隔符是否一致

时间:2013-04-04 14:29:55

标签: ruby-on-rails ruby regex csv

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

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

有效示例

  • “1023.12”
  • “2341,34”
  • “1245”
  • “1.456” - 请注意,它似乎是千位分隔符,没有小数的情况,但在thtat情况下,它应该被解释为小数点分隔符
  • “1,435” - 上面的观察

无效的示例

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

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

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

2 个答案:

答案 0 :(得分:3)

我认为这样可行:

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

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

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

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

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

答案 1 :(得分: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 || '.'

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