From 4ae4f49c2184174f750414e38f709aad25b4d3d3 Mon Sep 17 00:00:00 2001 From: David Grudl Date: Tue, 13 Oct 2015 13:14:08 +0200 Subject: [PATCH] Result: fixed normalization of float when ends with "0" [Closes #189] --- dibi/libs/DibiResult.php | 12 ++++- tests/dibi/DibiResult.normalize.phpt | 72 ++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/dibi/libs/DibiResult.php b/dibi/libs/DibiResult.php index 1a7813dd..e82fc910 100644 --- a/dibi/libs/DibiResult.php +++ b/dibi/libs/DibiResult.php @@ -494,7 +494,17 @@ class DibiResult extends DibiObject implements IDataSource $row[$key] = is_float($tmp = $value * 1) ? $value : $tmp; } elseif ($type === dibi::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 === dibi::BOOL) { $row[$key] = ((bool) $value) && $value !== 'f' && $value !== 'F'; diff --git a/tests/dibi/DibiResult.normalize.phpt b/tests/dibi/DibiResult.normalize.phpt index 7c660704..92bfa31b 100644 --- a/tests/dibi/DibiResult.normalize.phpt +++ b/tests/dibi/DibiResult.normalize.phpt @@ -56,3 +56,75 @@ test(function () { Assert::same(array('col' => 0), $result->test(array('col' => 0))); Assert::same(array('col' => 1), $result->test(array('col' => 1))); }); + + +test(function () { + $result = new MockResult; + $result->setType('col', dibi::FLOAT); + + Assert::same(array('col' => NULL), $result->test(array('col' => NULL))); + Assert::same(array('col' => 1.0), $result->test(array('col' => TRUE))); + Assert::same(array('col' => 0.0), $result->test(array('col' => FALSE))); + + Assert::same(array('col' => 0.0), $result->test(array('col' => ''))); + Assert::same(array('col' => 0.0), $result->test(array('col' => '0'))); + Assert::same(array('col' => 1.0), $result->test(array('col' => '1'))); + Assert::same(array('col' => 0.0), $result->test(array('col' => '.0'))); + Assert::same(array('col' => 0.1), $result->test(array('col' => '.1'))); + Assert::same(array('col' => 0.0), $result->test(array('col' => '0.0'))); + Assert::same(array('col' => 0.1), $result->test(array('col' => '0.1'))); + Assert::same(array('col' => 0.0), $result->test(array('col' => '0.000'))); + Assert::same(array('col' => 0.1), $result->test(array('col' => '0.100'))); + Assert::same(array('col' => 1.0), $result->test(array('col' => '1.0'))); + Assert::same(array('col' => 1.1), $result->test(array('col' => '1.1'))); + Assert::same(array('col' => 1.0), $result->test(array('col' => '1.000'))); + Assert::same(array('col' => 1.1), $result->test(array('col' => '1.100'))); + Assert::same(array('col' => 1.0), $result->test(array('col' => '001.000'))); + Assert::same(array('col' => 1.1), $result->test(array('col' => '001.100'))); + Assert::same(array('col' => 10.0), $result->test(array('col' => '10'))); + Assert::same(array('col' => 11.0), $result->test(array('col' => '11'))); + Assert::same(array('col' => 10.0), $result->test(array('col' => '0010'))); + Assert::same(array('col' => 11.0), $result->test(array('col' => '0011'))); + Assert::same(array('col' => '0.00000000000000000001'), $result->test(array('col' => '0.00000000000000000001'))); + Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '12345678901234567890'))); + Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '012345678901234567890'))); + Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '12345678901234567890.000'))); + Assert::same(array('col' => '12345678901234567890.1'), $result->test(array('col' => '012345678901234567890.100'))); + + Assert::same(array('col' => 0.0), $result->test(array('col' => 0))); + Assert::same(array('col' => 0.0), $result->test(array('col' => 0.0))); + Assert::same(array('col' => 1.0), $result->test(array('col' => 1))); + Assert::same(array('col' => 1.0), $result->test(array('col' => 1.0))); + + setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu'); + Assert::same(array('col' => 0.0), $result->test(array('col' => ''))); + Assert::same(array('col' => 0.0), $result->test(array('col' => '0'))); + Assert::same(array('col' => 1.0), $result->test(array('col' => '1'))); + Assert::same(array('col' => 0.0), $result->test(array('col' => '.0'))); + Assert::same(array('col' => 0.1), $result->test(array('col' => '.1'))); + Assert::same(array('col' => 0.0), $result->test(array('col' => '0.0'))); + Assert::same(array('col' => 0.1), $result->test(array('col' => '0.1'))); + Assert::same(array('col' => 0.0), $result->test(array('col' => '0.000'))); + Assert::same(array('col' => 0.1), $result->test(array('col' => '0.100'))); + Assert::same(array('col' => 1.0), $result->test(array('col' => '1.0'))); + Assert::same(array('col' => 1.1), $result->test(array('col' => '1.1'))); + Assert::same(array('col' => 1.0), $result->test(array('col' => '1.000'))); + Assert::same(array('col' => 1.1), $result->test(array('col' => '1.100'))); + Assert::same(array('col' => 1.0), $result->test(array('col' => '001.000'))); + Assert::same(array('col' => 1.1), $result->test(array('col' => '001.100'))); + Assert::same(array('col' => 10.0), $result->test(array('col' => '10'))); + Assert::same(array('col' => 11.0), $result->test(array('col' => '11'))); + Assert::same(array('col' => 10.0), $result->test(array('col' => '0010'))); + Assert::same(array('col' => 11.0), $result->test(array('col' => '0011'))); + Assert::same(array('col' => '0.00000000000000000001'), $result->test(array('col' => '0.00000000000000000001'))); + Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '12345678901234567890'))); + Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '012345678901234567890'))); + Assert::same(array('col' => '12345678901234567890'), $result->test(array('col' => '12345678901234567890.000'))); + Assert::same(array('col' => '12345678901234567890.1'), $result->test(array('col' => '012345678901234567890.100'))); + + Assert::same(array('col' => 0.0), $result->test(array('col' => 0))); + Assert::same(array('col' => 0.0), $result->test(array('col' => 0.0))); + Assert::same(array('col' => 1.0), $result->test(array('col' => 1))); + Assert::same(array('col' => 1.0), $result->test(array('col' => 1.0))); + setlocale(LC_NUMERIC, 'C'); +});