Files
lotteryLaravel/app/Support/CurrencyFormatter.php

48 lines
1.4 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Support;
use App\Services\LotterySettings;
/**
* 将「最小货币单位」整数格式化为展示用字符串(不改变业务数字,仅格式化)。
*
* 展示格式固定为 2 位小数、`.` 小数点、`,` 千分位;不从后台设置或环境变量读取。
*/
final class CurrencyFormatter
{
public static function fromMinor(int|string|null $minor): string
{
if ($minor === null || $minor === '') {
return self::formatMinorInt(0);
}
return self::formatMinorInt((int) $minor);
}
private static function formatMinorInt(int $minorUnits): string
{
$decimals = LotterySettings::currencyDisplayDecimals();
$decSep = LotterySettings::currencyDecimalSeparator();
$thousandsSep = LotterySettings::currencyThousandsSeparator();
$divisor = (int) max(1, 10 ** $decimals);
$negative = $minorUnits < 0;
$abs = abs($minorUnits);
$integerPart = intdiv($abs, $divisor);
$fractionRaw = $abs % $divisor;
$fractionPadded = str_pad((string) $fractionRaw, $decimals, '0', STR_PAD_LEFT);
$integerPartFormatted = number_format((float) $integerPart, 0, $decSep, $thousandsSep);
if ($decimals === 0) {
return ($negative ? '-' : '').$integerPartFormatted;
}
return ($negative ? '-' : '').$integerPartFormatted.$decSep.$fractionPadded;
}
}