英语和阿拉伯数字

英语和阿拉伯数字

问题描述:

我用下面的代码来验证numericality Rails中验证Numericality条件:英语和阿拉伯数字

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

而且它工作得很好,但后来我加了正则表达式来允许阿拉伯数字是这样的:

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

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

+0

'/ [0-9 \ u0660- \ u0669] * /'匹配任何字符串。使用'+'而不是'*'来匹配至少1次。 –

+0

我试过验证:number,:format => {:with =>/[0-9 \ u0660- \ u0669] + /},:numericality => {:greater_than_or_equal_to => 500} 但是不起作用阿拉伯数字现在是允许的,但条件'greater_than_or_equal_to => 500'不起作用) –

+0

是的,因为这并不明显。那么试试'/ \ A([5-9 \ u0665- \ u0669] [0-9 \ u0660- \ u0669] {2} | [0-9 \ u0660- \ u0669] {4,})\ z/' –

好的,这个数字可以定义为[0-9]并与阿拉伯数字[0-9\u0660-\u0669]组合。我们希望首先匹配500高达999。我们需要结合[5-9][\u0665-\u0669] - >[5-9\u0665-\u0669],它们将以59的ASCII和阿拉伯语表示匹配。在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

+1

完美的解决方案谢谢.. –

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

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