验证英语和阿拉伯数字的数值条件

Validate Numericality Conditions on English & Arabic Numbers

我正在使用以下代码来验证 Rails 中的数值:

validates :number, :numericality => {:greater_than_or_equal_to => 500}

它运行良好,但后来我添加了正则表达式以允许像这样的阿拉伯数字:

validates :number, :format =>{:with => /[0-9\u0660-\u0669]*/}

此处它接受阿拉伯数字,但条件 greater_than_or_equal_to => 500 仅适用于英文数字,​​我也需要它支持阿拉伯数字。

好吧,这个数字可以定义为[0-9]并与阿拉伯数字组合,[0-9\u0660-\u0669]。我们想先匹配 500999。我们需要将 [5-9][\u0665-\u0669] -> [5-9\u0665-\u0669] 结合起来,这将在 ASCII 和阿拉伯符号中匹配 59。在5-9之后可以有2个任意数字,所以我们需要在后面追加[0-9\u0660-\u0669]{2}

接下来,我们需要允许超过 999,即 1000 和更多的数字。所以,我们需要添加一个备选分支 [0-9\u0660-\u066‌​9]{4,}.

整个结果是

/\A([5-9\u0665-\u0669][0-9\u0660-\u0669]{2}|[0-9\u0660-\u066‌​9]{4,})\z/

其中 \A 匹配字符串的开头,\z 匹配字符串的结尾,(Branch_1|Branch_2) 是一个分组构造,可以通过添加将其变成非捕获构造?: 后初始 (:

/\A(?:[5-9\u0665-\u0669][0-9\u0660-\u0669]{2}|[0-9\u0660-\u066‌​9]{4,})\z/

regex demo

对于希望避免在这种情况下使用 regex 以允许阿拉伯数字与 Integer 数据库字段(而不是 string)一起使用的 ROR 用户,我发现 here 验证前将 Unicode 数字转换为 Integer 的一个很好的例子,所以仍然可以使用这样的条件:

validates :number, :numericality => {:greater_than_or_equal_to => 500}