diff --git a/README.md b/README.md
index c9ac868..5bdb0d1 100644
--- a/README.md
+++ b/README.md
@@ -284,6 +284,8 @@ Below is list of all available validation rules
* [min](#rule-min)
* [max](#rule-max)
* [between](#rule-between)
+* [digits](#rule-digits)
+* [digits_between](#rule-digits_between)
* [url](#rule-url)
* [ip](#rule-ip)
* [ipv4](#rule-ipv4)
@@ -477,6 +479,16 @@ Value size calculated in same way like `min` rule.
The field under this rule must have a size between min and max params.
Value size calculated in same way like `min` and `max` rule.
+
+#### digits:value
+
+The field under validation must be numeric and must have an exact length of `value`.
+
+
+#### digits_between:min,max
+
+The field under validation must have a length between the given `min` and `max`.
+
#### url
diff --git a/src/Rules/Digits.php b/src/Rules/Digits.php
new file mode 100644
index 0000000..b0f673f
--- /dev/null
+++ b/src/Rules/Digits.php
@@ -0,0 +1,24 @@
+requireParameters($this->fillable_params);
+
+ $length = (int) $this->parameter('length');
+
+ return ! preg_match('/[^0-9]/', $value)
+ && strlen((string) $value) == $length;
+ }
+
+}
diff --git a/src/Rules/DigitsBetween.php b/src/Rules/DigitsBetween.php
new file mode 100644
index 0000000..44d5183
--- /dev/null
+++ b/src/Rules/DigitsBetween.php
@@ -0,0 +1,27 @@
+requireParameters($this->fillable_params);
+
+ $min = (int) $this->parameter('min');
+ $max = (int) $this->parameter('max');
+
+ $length = strlen((string) $value);
+
+ return ! preg_match('/[^0-9]/', $value)
+ && $length >= $min && $length <= $max;
+ }
+
+}
diff --git a/src/Validator.php b/src/Validator.php
index 80c5046..bff4a0b 100644
--- a/src/Validator.php
+++ b/src/Validator.php
@@ -107,6 +107,8 @@ protected function registerBaseValidators()
'lowercase' => new Rules\Lowercase,
'uppercase' => new Rules\Uppercase,
'json' => new Rules\Json,
+ 'digits' => new Rules\Digits,
+ 'digits_between' => new Rules\DigitsBetween,
'defaults' => new Rules\Defaults,
'default' => new Rules\Defaults, // alias of defaults
];
diff --git a/tests/Rules/DigitsBetweenTest.php b/tests/Rules/DigitsBetweenTest.php
new file mode 100644
index 0000000..f84e694
--- /dev/null
+++ b/tests/Rules/DigitsBetweenTest.php
@@ -0,0 +1,29 @@
+rule = new DigitsBetween;
+ }
+
+ public function testValids()
+ {
+ $this->assertTrue($this->rule->fillParameters([2, 6])->check(12345));
+ $this->assertTrue($this->rule->fillParameters([2, 3])->check(12));
+ $this->assertTrue($this->rule->fillParameters([2, 3])->check(123));
+ $this->assertTrue($this->rule->fillParameters([3, 5])->check('12345'));
+ }
+
+ public function testInvalids()
+ {
+ $this->assertFalse($this->rule->fillParameters([4, 6])->check(12));
+ $this->assertFalse($this->rule->fillParameters([1, 3])->check(12345));
+ $this->assertFalse($this->rule->fillParameters([1, 3])->check(12345));
+ $this->assertFalse($this->rule->fillParameters([3, 6])->check('foobar'));
+ }
+
+}
diff --git a/tests/Rules/DigitsTest.php b/tests/Rules/DigitsTest.php
new file mode 100644
index 0000000..2523144
--- /dev/null
+++ b/tests/Rules/DigitsTest.php
@@ -0,0 +1,27 @@
+rule = new Digits;
+ }
+
+ public function testValids()
+ {
+ $this->assertTrue($this->rule->fillParameters([4])->check(1243));
+ $this->assertTrue($this->rule->fillParameters([6])->check(124567));
+ $this->assertTrue($this->rule->fillParameters([3])->check('123'));
+ }
+
+ public function testInvalids()
+ {
+ $this->assertFalse($this->rule->fillParameters([7])->check(12345678));
+ $this->assertFalse($this->rule->fillParameters([4])->check(12));
+ $this->assertFalse($this->rule->fillParameters([3])->check('foo'));
+ }
+
+}