32 lines
977 B
PHP
32 lines
977 B
PHP
<?php
|
|
|
|
namespace App\Serp\Operations;
|
|
|
|
use InvalidArgumentException;
|
|
|
|
final class Money
|
|
{
|
|
public static function micros(string|int|float|null $value): int
|
|
{
|
|
if ($value === null) {
|
|
return 0;
|
|
}$s = is_float($value) ? number_format($value, 6, '.', '') : (string) $value;
|
|
if (! preg_match('/^-?\d+(?:\.\d{1,6})?$/', $s)) {
|
|
throw new InvalidArgumentException('Invalid money value.');
|
|
}$negative = str_starts_with($s, '-');
|
|
$s = ltrim($s, '-');
|
|
[$whole,$fraction] = array_pad(explode('.', $s, 2), 2, '');
|
|
$result = ((int) $whole * 1000000) + (int) str_pad($fraction, 6, '0');
|
|
|
|
return $negative ? -$result : $result;
|
|
}
|
|
|
|
public static function decimal(int $micros): string
|
|
{
|
|
$negative = $micros < 0;
|
|
$micros = abs($micros);
|
|
|
|
return ($negative ? '-' : '').intdiv($micros, 1000000).'.'.str_pad((string) ($micros % 1000000), 6, '0', STR_PAD_LEFT);
|
|
}
|
|
}
|