Files
lotteryLaravel/app/Support/CurrencyFormatter.php

46 lines
1.5 KiB
PHP
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<?php
declare(strict_types=1);
namespace App\Support;
/**
* 将「最小货币单位」整数格式化为展示用字符串(不改变业务数字,仅格式化)。
*
* 拆分位数由 {@see config('lottery.ui.format.currency.decimals')} 决定,默认 2即 ÷100
*/
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 = max(0, min(12, (int) config('lottery.ui.format.currency.decimals', 2)));
$decSep = (string) config('lottery.ui.format.currency.decimal_separator', '.');
$thousandsSep = (string) config('lottery.ui.format.currency.thousands_separator', ',');
$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;
}
}