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

时间:2016-09-20 10:41:22

标签: ruby-on-rails regex validation arabic

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

好的,数字可以定义为[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)是一个分组结构,可以通过添加{{{}来转换为非捕获结构1}}在初始?:之后:

(

请参阅regex demo

答案 1 :(得分:0)

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

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