Files
2026-07-27 12:58:44 +03:00

3.5 KiB
Raw Permalink Blame History

Number — числа

App\Helpers\Number — форматирование чисел, размеров и русские склонения.

use App\Helpers\Number;

Форматирование

numFormat($number, $decimal = 0, $after = ',', $thousand = '.')

Обёртка number_format. Важно: для «пустого»/нулевого значения возвращает пустую строку '', а не 0.

Number::numFormat(1234567, 0, ',', ' ');   // '1 234 567'
Number::numFormat(1234.5, 2, '.', ' ');    // '1 234.50'
Number::numFormat(0);                       // '' ← учтите в вёрстке

decimal($number, $scale = 2)

Нормализует число для DECIMAL-полей БД: всегда с точкой, ноль не скрывает.

Number::decimal('1 234,5', 2);   // '1234.50'
Number::decimal(0);              // '0.00'

numberFormat($string, $type = null) / numberDeFormat($string)

Форматирование по типу и обратное снятие форматирования (строка → «сырое» число).


Размеры

formatSize($size) / getTextSize($size)

Байты → человекочитаемый размер.

Number::formatSize(1048576);   // '1 МБ'
Number::formatSize(2560);      // '2.5 КБ'

Русские склонения (важно для UI)

declensionNum($number, $titles)

Возвращает число + правильную форму слова. $titles — массив из 3 форм: [1, 2-4, 5-0].

Number::declensionNum(1,  ['товар', 'товара', 'товаров']);   // '1 товар'
Number::declensionNum(3,  ['товар', 'товара', 'товаров']);   // '3 товара'
Number::declensionNum(25, ['товар', 'товара', 'товаров']);   // '25 товаров'

Если нужна только форма слова без числа — это Locales::datePhrase($n, $titles).

numberToWords($number)

Число прописью (английский алфавит слов).


Сравнение и прочее

compareNumbers($float1, $float2, $operator = '=')

Сравнение чисел с плавающей точкой через эпсилон (0.00001) — избегает ошибок 0.1 + 0.2 != 0.3. Операторы: =/eq, </lt, >/gt, <=, >=.

if (Number::compareNumbers($sum, $expected, '=')) { ... }   // безопасно для float
if (Number::compareNumbers($price, 0, '>')) { ... }

priceCourse($price, $format = true, $float = null)

Подготовка цены к выводу: $float === false — округлить до целого; $format — применить форматирование.

Number::priceCourse(1234.7, true, false);   // '1 235' (округлено + формат)

randomNumber($digits = 1), microtimeDiff($a, $b)

Случайное число заданной разрядности; разница между двумя microtime.


Рецепты

Счётчик в интерфейсе:

echo Number::declensionNum($count, ['документ', 'документа', 'документов']);

Цена в карточке товара:

echo Number::numFormat($product['price'], 0, ',', ' ') . ' ₽';

Запись цены в БД (DECIMAL):

$row['price'] = Number::decimal($input['price'], 2);