|
123 | 123 | new Number(null);
|
124 | 124 | });
|
125 | 125 |
|
126 |
| -test('number can change decimals', function ($input, $scale, $result) { |
| 126 | +test('number can change decimals as a string input', function ($input, $scale, $result) { |
127 | 127 | $valueObject = new Number($input, $scale);
|
128 | 128 | $this->assertSame($result, $valueObject->value());
|
129 | 129 | })->with([
|
|
155 | 155 | ['777177711191777.99977777777777777777', 20, '777177711191777.99977777777777777777'],
|
156 | 156 | ]);
|
157 | 157 |
|
| 158 | +test('number can change decimals as a float input up to 14 characters/digits', function ($input, $scale, $result) { |
| 159 | + $valueObject = new Number($input, $scale); |
| 160 | + $this->assertSame($result, $valueObject->value()); |
| 161 | +})->with([ |
| 162 | + [111777999.97, 2, '111777999.97'], |
| 163 | + |
| 164 | + [7.1, 0, '7'], |
| 165 | + [7.1, 1, '7.1'], |
| 166 | + [7.11, 2, '7.11'], |
| 167 | + [7.99, 3, '7.990'], |
| 168 | + [70.1, 4, '70.1000'], |
| 169 | + [71.1, 5, '71.10000'], |
| 170 | + [17.9, 6, '17.900000'], |
| 171 | + [11.1, 7, '11.1000000'], |
| 172 | + [11.7, 8, '11.70000000'], |
| 173 | + [77.77, 9, '77.770000000'], |
| 174 | + [777.7, 10, '777.7000000000'], |
| 175 | + [777.7, 11, '777.70000000000'], |
| 176 | + [777.77, 12, '777.770000000000'], |
| 177 | + [777.777, 13, '777.7770000000000'], |
| 178 | + [7771.777, 14, '7771.77700000000000'], |
| 179 | + [7771.7771, 15, '7771.777100000000000'], |
| 180 | + [7771.77711, 16, '7771.7771100000000000'], |
| 181 | + [7771.777111, 17, '7771.77711100000000000'], |
| 182 | + [7771.7771119, 18, '7771.777111900000000000'], |
| 183 | + [7771.77711199, 19, '7771.7771119900000000000'], |
| 184 | + [3210987654321.0, 2, '3210987654321.00'], |
| 185 | + [290987654321.78, 2, '290987654321.78'], |
| 186 | + [92233720368.987, 2, '92233720368.98'], |
| 187 | + [9223372036.8547, 2, '9223372036.85'], |
| 188 | + [1.999999999999, 12, '1.999999999999'], |
| 189 | + [2.9999999999999, 12, '2.999999999999'], |
| 190 | + [290987654321.78, 3, '290987654321.780'], |
| 191 | + [92233720368.987, 3, '92233720368.987'], |
| 192 | + [9223372036.8547, 3, '9223372036.854'], |
| 193 | + [7771.0777110012, 3, '7771.077'], |
| 194 | + [9876.100077799, 3, '9876.100'], |
| 195 | + [1.543210987671, 3, '1.543'], |
| 196 | + [00002.5432109876712, 3, '2.543'], |
| 197 | + [3.5432109876789, 3, '3.543'], |
| 198 | + [11.543210987671, 3, '11.543'], |
| 199 | + [10987654321.789, 3, '10987654321.789'], |
| 200 | + [3210987654321.7, 3, '3210987654321.700'], |
| 201 | + [44210987654321.0, 3, '44210987654321.000'], |
| 202 | + [92233720368.547, 3, '92233720368.547'], |
| 203 | +]); |
| 204 | + |
| 205 | +test('numeric integer in float form input up to 14 characters/digitss', function ($input, $scale, $result) { |
| 206 | + $valueObject = new Number($input, $scale); |
| 207 | + $this->assertSame($result, $valueObject->value()); |
| 208 | +})->with([ |
| 209 | + [1.0, 3, '1.000'], |
| 210 | + [2.0000, 3, '2.000'], |
| 211 | + [1234567890.0000, 3, '1234567890.000'], |
| 212 | + [12345678901234.0000, 3, '12345678901234.000'], |
| 213 | +]); |
| 214 | + |
| 215 | +test('no conversion of decimal numbers as float input above 14 characters/digits', function ($number) { |
| 216 | + try { |
| 217 | + new Number($number, 20); |
| 218 | + $this->assertFalse(true); |
| 219 | + } catch (LengthException $e) { |
| 220 | + $this->assertSame(0, $e->getCode()); |
| 221 | + $this->assertSame('Float precision loss detected.', $e->getMessage()); |
| 222 | + } |
| 223 | +})->with([ |
| 224 | + 11.5432109876731, |
| 225 | + 6667777.1234567890123456789, |
| 226 | + 5556666.2345678901234567891, |
| 227 | + 4445555.3456789012345678912, |
| 228 | + 3334444.4567890123456789123, |
| 229 | + 2223333.5678901234567891234, |
| 230 | + 1112222.6789012345678912345, |
| 231 | + 9991111.7890123456789123456, |
| 232 | + 8880000.8901234567891234567, |
| 233 | + 8889999.9012345678912345678, |
| 234 | + 7778888.0123456789123456789, |
| 235 | + 9553543210987654321.77711199, |
| 236 | + 777177711191777.99977777777777777777, |
| 237 | +]); |
| 238 | + |
158 | 239 | test('number can handle huge numbers', function ($input, $scale, $result) {
|
159 | 240 | $valueObject = new Number($input, $scale);
|
160 | 241 | $this->assertSame($result, $valueObject->value());
|
@@ -250,17 +331,16 @@ class_uses_recursive(Number::class)
|
250 | 331 | test('can extend protected methods in number', function () {
|
251 | 332 | $number = new TestNumber('1 230,00');
|
252 | 333 | $this->assertSame('1230.00', $number->value());
|
| 334 | + $number = new TestNumber(1230.12); |
| 335 | + $this->assertSame('1230.12', $number->value()); |
253 | 336 | });
|
254 | 337 |
|
255 | 338 | class TestNumber extends Number
|
256 | 339 | {
|
257 |
| - public function __construct(int|string $number, protected int $scale = 2) |
| 340 | + public function __construct(int|string|float $number, protected int $scale = 2) |
258 | 341 | {
|
259 |
| - $this->bigNumber = new BigNumber($this->sanitize($number), $this->scale); |
260 |
| - } |
| 342 | + parent::isPrecise((float) $number); |
261 | 343 |
|
262 |
| - protected function sanitize(int|string|null $number): string |
263 |
| - { |
264 |
| - return parent::sanitize($number); |
| 344 | + $this->bigNumber = new BigNumber($this->sanitize($number), $this->scale); |
265 | 345 | }
|
266 | 346 | }
|
0 commit comments