From a99dbae01231d5568e9b3760fdd60a19542bd83e Mon Sep 17 00:00:00 2001 From: Will Rossiter Date: Sat, 11 May 2013 22:51:39 +1200 Subject: [PATCH] FIX: NumericField should work with numbers like 54,6 Fixes http://open.silverstripe.org/ticket/5577. Uses Zend_Locale_Format::isNumber(). Includes unit test for NumericField. Does not include testing work on DBField underlying NumericField to ensure that works consistently. --- forms/NumericField.php | 25 +++++++++++++++------ tests/forms/NumericFieldTest.php | 37 ++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 7 deletions(-) create mode 100644 tests/forms/NumericFieldTest.php diff --git a/forms/NumericField.php b/forms/NumericField.php index ba519dae6..6039f36d1 100644 --- a/forms/NumericField.php +++ b/forms/NumericField.php @@ -1,19 +1,29 @@ value && !is_numeric(trim($this->value))){ + public function validate($validator) { + if(!$this->value && !$validator->fieldIsRequired($this->name)) { + return true; + } + + $valid = Zend_Locale_Format::isNumber( + trim($this->value), + array('locale' => i18n::get_locale()) + ); + + if(!$valid) { $validator->validationError( $this->name, _t( @@ -22,10 +32,11 @@ class NumericField extends TextField{ ), "validation" ); + return false; - } else{ - return true; } + + return true; } public function dataValue() { diff --git a/tests/forms/NumericFieldTest.php b/tests/forms/NumericFieldTest.php new file mode 100644 index 000000000..bd55c0ae6 --- /dev/null +++ b/tests/forms/NumericFieldTest.php @@ -0,0 +1,37 @@ +setValue('12.00'); + + $validator = new RequiredFields('Number'); + $this->assertTrue($field->validate($validator)); + + $field->setValue('12,00'); + $this->assertFalse($field->validate($validator)); + + $field->setValue('0'); + $this->assertTrue($field->validate($validator)); + + $field->setValue(false); + $this->assertFalse($field->validate($validator)); + + i18n::set_locale('de_DE'); + $field->setValue('12,00'); + $validator = new RequiredFields(); + $this->assertTrue($field->validate($validator)); + + $field->setValue('12.00'); + $this->assertFalse($field->validate($validator)); + } +} \ No newline at end of file