Клас Illuminate\Support\Number - обгортка над розширенням intl для форматування чисел з урахуванням локалі. Для більшості методів розширення intl обов'язкове.
use Illuminate\Support\Number;
Number::format(1234567.891, precision: 2, locale: 'uk'); // '1 234 567,89'
Number::currency(1500, in: 'UAH', locale: 'uk'); // '1 500,00 ₴'
Number::percentage(12.345, precision: 1); // '12.3%'
Number::fileSize(1536000, precision: 1); // '1.5 MB'
Number::abbreviate(1500000, precision: 1); // '1.5M'
Number::forHumans(1500000); // '2 million'
Number::spell(42, locale: 'uk'); // 'сорок два'
Number::ordinal(3); // '3rd'
Number::clamp($value, min: 1, max: 100);
Що варто знати:
precisionза замовчуванням 0 уfileSize,abbreviateіforHumans:Number::forHumans(1500000)округлює до'2 million'. Для дробової частини вказуйтеprecision;fileSizeрахує в степенях 1024, а не 1000;forHumansіabbreviateне локалізовані: вони завжди пишуть англійською (million,M);format,currency,percentage,spellприймаютьlocale, а в українській локалі роздільник тисяч - нерозривний пробіл, десятковий - кома.
Локаль для всього застосунку чи фрагмента:
// у сервіс-провайдері
Number::useLocale('uk');
Number::useCurrency('UAH');
// тимчасово для одного блоку
Number::withLocale('de', fn () => Number::format(1234.5)); // '1.234,5'
Зворотна операція - розібрати введене користувачем число з урахуванням локалі:
Number::parseFloat('1 234,5', locale: 'uk');
Гроші: Number::currency() - лише для відображення. Рахувати гроші через float не можна: зберігайте суму в копійках цілим числом (або в decimal у базі) і форматуйте тільки при виводі:
Number::currency($order->total_cents / 100, in: 'UAH');
У Blade це зручно загорнути в accessor моделі чи Blade-компонент, щоб формат валюти й точність були однаковими на всьому сайті.