我有一个包含许多列的CSV::Table
对象。每列由一定数量的元素组成,这些元素是应该包含数字的字符串。
它可以同时使用"."
或","
作为小数点分隔符,并且不能包含任何千位分隔符。
有效示例
无效的示例
另外,我需要确保小数分隔符在所有列和行中是一致的;所以我需要提取使用的小数点分隔符(","
或"."
)。
我可以使用什么正则表达式来检查字符串的有效性并提取小数点分隔符以检查表中的一致性?
答案 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]中的可选小数分隔符。如果任何匹配失败(不是数字)则出错。如果存在多种分隔符(不一致)则会出错。如果没有分隔符,则假设'。'默认情况下。