Browse Source

Merge pull request #2864 from AD7six/2.4-better-float-validation

account for localized floats more robustly.
Mark Story 12 years ago
parent
commit
4497bab131
2 changed files with 11 additions and 7 deletions
  1. 6 3
      lib/Cake/Test/Case/Utility/ValidationTest.php
  2. 5 4
      lib/Cake/Utility/Validation.php

+ 6 - 3
lib/Cake/Test/Case/Utility/ValidationTest.php

@@ -1660,12 +1660,15 @@ class ValidationTest extends CakeTestCase {
  * @return void
  */
 	public function testDecimalLocaleSet() {
-		$this->skipIf(DS === '\\', 'The locale is not supported in Windows and affect the others tests.');
+		$this->skipIf(DS === '\\', 'The locale is not supported in Windows and affects other tests.');
 		$restore = setlocale(LC_NUMERIC, 0);
 		$this->skipIf(setlocale(LC_NUMERIC, 'de_DE') === false, "The German locale isn't available.");
 
-		$this->assertTrue(Validation::decimal(1.54));
-		$this->assertTrue(Validation::decimal('1.54'));
+		$this->assertTrue(Validation::decimal(1.54), '1.54 should be considered a valid float');
+		$this->assertTrue(Validation::decimal('1.54'), '"1.54" should be considered a valid float');
+
+		$this->assertTrue(Validation::decimal(12345.67), '12345.67 should be considered a valid float');
+		$this->assertTrue(Validation::decimal('12,345.67'), '"12,345.67" should be considered a valid float');
 
 		setlocale(LC_NUMERIC, $restore);
 	}

+ 5 - 4
lib/Cake/Utility/Validation.php

@@ -426,10 +426,11 @@ class Validation {
 			}
 		}
 
-		// Workaround localized floats.
-		if (is_float($check)) {
-			$check = str_replace(',', '.', strval($check));
-		}
+		// account for localized floats.
+		$data = localeconv();
+		$check = str_replace($data['thousands_sep'], '', $check);
+		$check = str_replace($data['decimal_point'], '.', $check);
+
 		return self::_check($check, $regex);
 	}