Skip to content

Commit 2c7b35c

Browse files
typekczdg
authored andcommitted
Result::normalize() Fixed normalization of "-." numbers
1 parent c04d219 commit 2c7b35c

File tree

2 files changed

+74
-1
lines changed

2 files changed

+74
-1
lines changed

src/Dibi/Result.php

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -466,7 +466,13 @@ private function normalize(array &$row): void
466466
: $tmp;
467467

468468
} elseif ($type === Type::Float) {
469-
$value = ltrim((string) $value, '0');
469+
if (!is_string($value)) {
470+
$row[$key] = (float) $value;
471+
continue;
472+
}
473+
474+
$negative = ($value[0] ?? null) === '-';
475+
$value = ltrim($value, '0-');
470476
$p = strpos($value, '.');
471477
$e = strpos($value, 'e');
472478
if ($p !== false && $e === false) {
@@ -479,6 +485,10 @@ private function normalize(array &$row): void
479485
$value = '0' . $value;
480486
}
481487

488+
if ($negative) {
489+
$value = '-' . $value;
490+
}
491+
482492
$row[$key] = $value === str_replace(',', '.', (string) ($float = (float) $value))
483493
? $float
484494
: $value;

tests/dibi/Result.normalize.phpt

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,37 @@ test('', function () {
117117
Assert::same(['col' => '1.1e+10'], $result->test(['col' => '001.1e+10']));
118118
Assert::notSame(['col' => '1.1e+1'], $result->test(['col' => '1.1e+10']));
119119

120+
// negative
121+
Assert::same(['col' => -0.0], $result->test(['col' => '-']));
122+
Assert::same(['col' => -0.0], $result->test(['col' => '-0']));
123+
Assert::same(['col' => -1.0], $result->test(['col' => '-1']));
124+
Assert::same(['col' => -0.0], $result->test(['col' => '-.0']));
125+
Assert::same(['col' => -0.1], $result->test(['col' => '-.1']));
126+
Assert::same(['col' => -0.0], $result->test(['col' => '-0.0']));
127+
Assert::same(['col' => -0.1], $result->test(['col' => '-0.1']));
128+
Assert::same(['col' => -0.0], $result->test(['col' => '-0.000']));
129+
Assert::same(['col' => -0.1], $result->test(['col' => '-0.100']));
130+
Assert::same(['col' => -1.0], $result->test(['col' => '-1.0']));
131+
Assert::same(['col' => -1.1], $result->test(['col' => '-1.1']));
132+
Assert::same(['col' => -1.0], $result->test(['col' => '-1.000']));
133+
Assert::same(['col' => -1.1], $result->test(['col' => '-1.100']));
134+
Assert::same(['col' => -1.0], $result->test(['col' => '-001.000']));
135+
Assert::same(['col' => -1.1], $result->test(['col' => '-001.100']));
136+
Assert::same(['col' => -10.0], $result->test(['col' => '-10']));
137+
Assert::same(['col' => -11.0], $result->test(['col' => '-11']));
138+
Assert::same(['col' => -10.0], $result->test(['col' => '-0010']));
139+
Assert::same(['col' => -11.0], $result->test(['col' => '-0011']));
140+
Assert::same(['col' => '-0.00000000000000000001'], $result->test(['col' => '-0.00000000000000000001']));
141+
Assert::same(['col' => '-12345678901234567890'], $result->test(['col' => '-12345678901234567890']));
142+
Assert::same(['col' => '-12345678901234567890'], $result->test(['col' => '-012345678901234567890']));
143+
Assert::same(['col' => '-12345678901234567890'], $result->test(['col' => '-12345678901234567890.000']));
144+
Assert::same(['col' => '-12345678901234567890.1'], $result->test(['col' => '-012345678901234567890.100']));
145+
146+
Assert::same(['col' => '-1.1e+10'], $result->test(['col' => '-1.1e+10']));
147+
Assert::same(['col' => '-1.1e-10'], $result->test(['col' => '-1.1e-10']));
148+
Assert::same(['col' => '-1.1e+10'], $result->test(['col' => '-001.1e+10']));
149+
Assert::notSame(['col' => '-1.1e+1'], $result->test(['col' => '-1.1e+10']));
150+
120151
setlocale(LC_ALL, 'de_DE@euro', 'de_DE', 'deu_deu');
121152
Assert::same(['col' => 0.0], $result->test(['col' => '']));
122153
Assert::same(['col' => 0.0], $result->test(['col' => '0']));
@@ -147,6 +178,38 @@ test('', function () {
147178
Assert::same(['col' => 0.0], $result->test(['col' => 0.0]));
148179
Assert::same(['col' => 1.0], $result->test(['col' => 1]));
149180
Assert::same(['col' => 1.0], $result->test(['col' => 1.0]));
181+
182+
// Same but negative
183+
Assert::same(['col' => -0.0], $result->test(['col' => '-']));
184+
Assert::same(['col' => -0.0], $result->test(['col' => '-0']));
185+
Assert::same(['col' => -1.0], $result->test(['col' => '-1']));
186+
Assert::same(['col' => -0.0], $result->test(['col' => '-.0']));
187+
Assert::same(['col' => -0.1], $result->test(['col' => '-.1']));
188+
Assert::same(['col' => -0.0], $result->test(['col' => '-0.0']));
189+
Assert::same(['col' => -0.1], $result->test(['col' => '-0.1']));
190+
Assert::same(['col' => -0.0], $result->test(['col' => '-0.000']));
191+
Assert::same(['col' => -0.1], $result->test(['col' => '-0.100']));
192+
Assert::same(['col' => -1.0], $result->test(['col' => '-1.0']));
193+
Assert::same(['col' => -1.1], $result->test(['col' => '-1.1']));
194+
Assert::same(['col' => -1.0], $result->test(['col' => '-1.000']));
195+
Assert::same(['col' => -1.1], $result->test(['col' => '-1.100']));
196+
Assert::same(['col' => -1.0], $result->test(['col' => '-001.000']));
197+
Assert::same(['col' => -1.1], $result->test(['col' => '-001.100']));
198+
Assert::same(['col' => -10.0], $result->test(['col' => '-10']));
199+
Assert::same(['col' => -11.0], $result->test(['col' => '-11']));
200+
Assert::same(['col' => -10.0], $result->test(['col' => '-0010']));
201+
Assert::same(['col' => -11.0], $result->test(['col' => '-0011']));
202+
Assert::same(['col' => '-0.00000000000000000001'], $result->test(['col' => '-0.00000000000000000001']));
203+
Assert::same(['col' => '-12345678901234567890'], $result->test(['col' => '-12345678901234567890']));
204+
Assert::same(['col' => '-12345678901234567890'], $result->test(['col' => '-012345678901234567890']));
205+
Assert::same(['col' => '-12345678901234567890'], $result->test(['col' => '-12345678901234567890.000']));
206+
Assert::same(['col' => '-12345678901234567890.1'], $result->test(['col' => '-012345678901234567890.100']));
207+
208+
Assert::same(['col' => -0.0], $result->test(['col' => -0]));
209+
Assert::same(['col' => -0.0], $result->test(['col' => -0.0]));
210+
Assert::same(['col' => -1.0], $result->test(['col' => -1]));
211+
Assert::same(['col' => -1.0], $result->test(['col' => -1.0]));
212+
150213
setlocale(LC_NUMERIC, 'C');
151214
});
152215

0 commit comments

Comments
 (0)