我正在使用以下代码验证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 :(得分:1)
好的,数字可以定义为[0-9]
并与阿拉伯语[0-9\u0660-\u0669]
结合使用。我们希望首先将500
与999
匹配。我们需要将[5-9]
与[\u0665-\u0669]
- >合并[5-9\u0665-\u0669]
在ASCII和阿拉伯语表示法中将5
与9
匹配。在5-9
之后,可能还有2个数字,因此我们需要将[0-9\u0660-\u0669]{2}
附加到其中。
接下来,我们需要允许的数字超过999
,即1000
等。因此,我们需要添加一个替代分支[0-9\u0660-\u0669]{4,}
。
整个结果是
/\A([5-9\u0665-\u0669][0-9\u0660-\u0669]{2}|[0-9\u0660-\u0669]{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}