Number
Lift\Support\Number предоставляет статические помощники для форматирования чисел, денег, размеров файлов и больших значений. Когда присутствует PHP-расширение intl, money() и форматирование под локаль используют NumberFormatter для корректного вывода по локали; иначе встроенный запасной вариант покрывает наиболее распространённые валюты.
use Lift\Support\Number;
Number::money(1234.50, 'USD'); // "$1,234.50"
Number::money(1234.50, 'EUR', 'de_DE'); // "1.234,50 €"
Number::percent(85.6); // "85.6%"
Number::fileSize(1_572_864); // "1.5 MB"
Number::abbreviate(2_300_000); // "2.3M"
Number::ordinal(21); // "21st"
money()
Number::money(float|int $amount, string $currency = 'USD', string $locale = 'en_US'): string
Форматирует сумму с правильным символом валюты, группировкой и количеством десятичных знаков для заданной локали.
Number::money(1234.5); // "$1,234.50" (USD, en_US)
Number::money(1234.5, 'EUR', 'fr_FR'); // "1 234,50 €"
Number::money(1234.5, 'GBP', 'en_GB'); // "£1,234.50"
Number::money(150_000, 'JPY', 'ja_JP'); // "¥150,000" (без десятичных)
Number::money(9900, 'UAH', 'uk_UA'); // "9 900,00 ₴"
Когда intl не установлен, запасной вариант покрывает USD, EUR, GBP, JPY, CAD, AUD, INR, RUB, UAH и ещё около десятка. Неизвестные валюты предваряются своим ISO-кодом (CHF 1,234.50).
format()
Number::format(float|int $value, int $decimals = 2, string $decimal = '.', string $thousands = ','): string
Универсальный форматтер чисел с настраиваемыми разделителями.
Number::format(1234567.891); // "1,234,567.89"
Number::format(1234567.891, 0); // "1,234,568"
Number::format(1234567.891, 2, ',', '.'); // "1.234.567,89" (европейский)
Number::format(0.5, 4); // "0.5000"
percent()
Number::percent(float|int $value, int $decimals = 1): string
Передавайте значение как обычный процент — не дробь.
Number::percent(85.6); // "85.6%"
Number::percent(100, 0); // "100%"
Number::percent(33.333, 2); // "33.33%"
Number::percent(0.5); // "0.5%"
fileSize()
Number::fileSize(int $bytes, int $decimals = 1): string
Форматирует количество байт с двоичными префиксами (1 КБ = 1 024 Б).
Number::fileSize(0); // "0 B"
Number::fileSize(512); // "512 B"
Number::fileSize(1_024); // "1.0 KB"
Number::fileSize(1_572_864); // "1.5 MB"
Number::fileSize(1_073_741_824); // "1.0 GB"
Number::fileSize(1_099_511_627_776); // "1.0 TB"
Number::fileSize(1_572_864, 2); // "1.50 MB"
abbreviate()
Number::abbreviate(float|int $value, int $decimals = 1): string
Сокращает большие числа суффиксами K / M / B / T.
Number::abbreviate(999); // "999"
Number::abbreviate(1_000); // "1.0K"
Number::abbreviate(1_500); // "1.5K"
Number::abbreviate(2_300_000); // "2.3M"
Number::abbreviate(4_100_000_000); // "4.1B"
Number::abbreviate(1_200_000_000_000);// "1.2T"
Number::abbreviate(2_300_000, 2); // "2.30M"
ordinal()
Number::ordinal(int $value): string
Добавляет правильный английский порядковый суффикс.
Number::ordinal(1); // "1st"
Number::ordinal(2); // "2nd"
Number::ordinal(3); // "3rd"
Number::ordinal(4); // "4th"
Number::ordinal(11); // "11th" (особый случай)
Number::ordinal(12); // "12th"
Number::ordinal(21); // "21st"
Number::ordinal(101); // "101st"
Практические рецепты
Ответ API с ценой
$app->get('/products/{id}', function (Request $req) use ($db) {
$product = $db->table('products')->where('id', $req->param('id'))->first();
return Response::json([
'name' => $product['name'],
'price' => Number::money($product['price_cents'] / 100, 'USD'),
'price_raw' => $product['price_cents'],
'rating' => Number::percent($product['rating'] * 10, 0),
]);
});
Отображение использования хранилища
$used = $user['storage_bytes'];
$limit = 5 * 1024 ** 3; // 5 ГБ
echo sprintf(
'Using %s of %s (%s)',
Number::fileSize($used),
Number::fileSize($limit),
Number::percent($used / $limit * 100, 1),
);
// "Using 1.2 GB of 5.0 GB (24.0%)"
Позиция в таблице лидеров
foreach ($leaderboard as $i => $entry) {
echo Number::ordinal($i + 1) . '. ' . $entry['name'];
}
// "1st. Alice", "2nd. Bob", "3rd. Carol", …
Шпаргалка
use Lift\Support\Number;
Number::money(1234.5, 'USD') // "$1,234.50"
Number::money(1234.5, 'EUR', 'de_DE') // "1.234,50 €"
Number::format(1234567.89, 2) // "1,234,567.89"
Number::percent(85.6) // "85.6%"
Number::fileSize(1_572_864) // "1.5 MB"
Number::abbreviate(2_300_000) // "2.3M"
Number::ordinal(21) // "21st"