diff --git a/src/Dibi/Result.php b/src/Dibi/Result.php index 66357f2c..7de40b3b 100644 --- a/src/Dibi/Result.php +++ b/src/Dibi/Result.php @@ -497,7 +497,17 @@ class Result implements IDataSource $row[$key] = is_float($tmp = $value * 1) ? $value : $tmp; } elseif ($type === Type::FLOAT) { - $row[$key] = str_replace(',', '.', ltrim((string) ($tmp = (float) $value), '0')) === ltrim(rtrim(rtrim($value, '0'), '.'), '0') ? $tmp : $value; + $value = ltrim($value, '0'); + $p = strpos($value, '.'); + if ($p !== FALSE) { + $value = rtrim(rtrim($value, '0'), '.'); + } + if ($value === '' || $value[0] === '.') { + $value = '0' . $value; + } + $row[$key] = $value === str_replace(',', '.', (string) ($float = (float) $value)) + ? $float + : $value; } elseif ($type === Type::BOOL) { $row[$key] = ((bool) $value) && $value !== 'f' && $value !== 'F'; diff --git a/tests/dibi/Result.normalize.phpt b/tests/dibi/Result.normalize.phpt index 3b71b193..6a96d0d2 100644 --- a/tests/dibi/Result.normalize.phpt +++ b/tests/dibi/Result.normalize.phpt @@ -57,3 +57,75 @@ test(function () { Assert::same(['col' => '0'], $result->test(['col' => 0])); Assert::same(['col' => '1'], $result->test(['col' => 1])); }); + + +test(function () { + $result = new MockResult; + $result->setType('col', Type::FLOAT); + + Assert::same(['col' => NULL], $result->test(['col' => NULL])); + Assert::same(['col' => 1.0], $result->test(['col' => TRUE])); + Assert::same(['col' => 0.0], $result->test(['col' => FALSE])); + + Assert::same(['col' => 0.0], $result->test(['col' => ''])); + Assert::same(['col' => 0.0], $result->test(['col' => '0'])); + Assert::same(['col' => 1.0], $result->test(['col' => '1'])); + Assert::same(['col' => 0.0], $result->test(['col' => '.0'])); + Assert::same(['col' => 0.1], $result->test(['col' => '.1'])); + Assert::same(['col' => 0.0], $result->test(['col' => '0.0'])); + Assert::same(['col' => 0.1], $result->test(['col' => '0.1'])); + Assert::same(['col' => 0.0], $result->test(['col' => '0.000'])); + Assert::same(['col' => 0.1], $result->test(['col' => '0.100'])); + Assert::same(['col' => 1.0], $result->test(['col' => '1.0'])); + Assert::same(['col' => 1.1], $result->test(['col' => '1.1'])); + Assert::same(['col' => 1.0], $result->test(['col' => '1.000'])); + Assert::same(['col' => 1.1], $result->test(['col' => '1.100'])); + Assert::same(['col' => 1.0], $result->test(['col' => '001.000'])); + Assert::same(['col' => 1.1], $result->test(['col' => '001.100'])); + Assert::same(['col' => 10.0], $result->test(['col' => '10'])); + Assert::same(['col' => 11.0], $result->test(['col' => '11'])); + Assert::same(['col' => 10.0], $result->test(['col' => '0010'])); + Assert::same(['col' => 11.0], $result->test(['col' => '0011'])); + Assert::same(['col' => '0.00000000000000000001'], $result->test(['col' => '0.00000000000000000001'])); + Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '12345678901234567890'])); + Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '012345678901234567890'])); + Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '12345678901234567890.000'])); + Assert::same(['col' => '12345678901234567890.1'], $result->test(['col' => '012345678901234567890.100'])); + + Assert::same(['col' => 0.0], $result->test(['col' => 0])); + Assert::same(['col' => 0.0], $result->test(['col' => 0.0])); + Assert::same(['col' => 1.0], $result->test(['col' => 1])); + Assert::same(['col' => 1.0], $result->test(['col' => 1.0])); + + setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu'); + Assert::same(['col' => 0.0], $result->test(['col' => ''])); + Assert::same(['col' => 0.0], $result->test(['col' => '0'])); + Assert::same(['col' => 1.0], $result->test(['col' => '1'])); + Assert::same(['col' => 0.0], $result->test(['col' => '.0'])); + Assert::same(['col' => 0.1], $result->test(['col' => '.1'])); + Assert::same(['col' => 0.0], $result->test(['col' => '0.0'])); + Assert::same(['col' => 0.1], $result->test(['col' => '0.1'])); + Assert::same(['col' => 0.0], $result->test(['col' => '0.000'])); + Assert::same(['col' => 0.1], $result->test(['col' => '0.100'])); + Assert::same(['col' => 1.0], $result->test(['col' => '1.0'])); + Assert::same(['col' => 1.1], $result->test(['col' => '1.1'])); + Assert::same(['col' => 1.0], $result->test(['col' => '1.000'])); + Assert::same(['col' => 1.1], $result->test(['col' => '1.100'])); + Assert::same(['col' => 1.0], $result->test(['col' => '001.000'])); + Assert::same(['col' => 1.1], $result->test(['col' => '001.100'])); + Assert::same(['col' => 10.0], $result->test(['col' => '10'])); + Assert::same(['col' => 11.0], $result->test(['col' => '11'])); + Assert::same(['col' => 10.0], $result->test(['col' => '0010'])); + Assert::same(['col' => 11.0], $result->test(['col' => '0011'])); + Assert::same(['col' => '0.00000000000000000001'], $result->test(['col' => '0.00000000000000000001'])); + Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '12345678901234567890'])); + Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '012345678901234567890'])); + Assert::same(['col' => '12345678901234567890'], $result->test(['col' => '12345678901234567890.000'])); + Assert::same(['col' => '12345678901234567890.1'], $result->test(['col' => '012345678901234567890.100'])); + + Assert::same(['col' => 0.0], $result->test(['col' => 0])); + Assert::same(['col' => 0.0], $result->test(['col' => 0.0])); + Assert::same(['col' => 1.0], $result->test(['col' => 1])); + Assert::same(['col' => 1.0], $result->test(['col' => 1.0])); + setlocale(LC_NUMERIC, 'C'); +});