2016-09-20 133 views
3

我用下面的代碼來驗證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/' –

回答

1

好的,這個數字可以定義爲[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

完美的解決方案謝謝.. –

0

對於希望避免在這種情況下使用regex來允許阿拉伯數字與Integer數據庫字段(而不是string)一起工作的ROR用戶,我發現here是在驗證之前將Unicode數字轉換爲Integer的一個很好的示例,所以它仍然是可能使用這樣的條件:

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