Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Validate Numericality Conditions on English & Arabic Numbers

I'm using the following code to validate numericality in Rails:

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

And it works well, but then I added regex to allow Arabic numbers like this:

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

Here it accepts Arabic numbers but the condition greater_than_or_equal_to => 500 is working only on English numbers and I need it to support Arabic numbers too.

like image 964
Moamen Naanou Avatar asked Nov 26 '25 08:11

Moamen Naanou


1 Answers

Alright, the digit can be defined as [0-9] and combined with Arabic ones, [0-9\u0660-\u0669]. We want to match 500 up to 999 first. We need to combine [5-9] with [\u0665-\u0669] -> [5-9\u0665-\u0669] that will match 5 to 9 in both ASCII and Arabic notations. After 5-9, there can be 2 more any digits, so we need to append [0-9\u0660-\u0669]{2} to it.

Next, we need to allow numbers more than 999, that is, 1000 and more. So, we need to add an alternative branch [0-9\u0660-\u066‌​9]{4,}.

The whole result is

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

Where \A matches the start of string, \z matches the end of the string and (Branch_1|Branch_2) is a grouping construct that may be turned into a non-capturing one by adding ?: after the initial (:

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

See the regex demo

like image 107
Wiktor Stribiżew Avatar answered Nov 28 '25 01:11

Wiktor Stribiżew



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!