Войти Регистрация
Фронтенд

38. Строка истории операций: «Вчера, 23:50 · +15 000 ₽»

Средняя

В истории операций Альфа-Банка у каждой строки подпись: когда и сколько. Intl.DateTimeFormat на части Android-устройств и в старом WebView даёт «21 окт.» вместо «21 октября», поэтому форматируем сами.

Напишите formatOperation(op, now). op = { amount, currency, at }: amount — целое в копейках (центах), минус — списание; currency — RUB, USD или EUR; at и now — местное время строкой ГГГГ-ММ-ДДTЧЧ:ММ, без часового пояса.

Дата: тот же календарный день, что now, — «Сегодня»; предыдущий — «Вчера»; иначе «8 марта», а если год другой — «31 декабря 2025». Месяц в родительном падеже. Время — как в at.

Сумма: знак «+» для поступлений и «−» (U+2212, не дефис) для списаний, ноль без знака. Рубли группируются по три цифры обычным пробелом, копейки — через запятую и только если они не нулевые. Символ валюты через пробел после числа: ₽, $, €. Итог: <дата>, <время> · <сумма>.

В работе: История операций, выписки, чеки, ленты событий с относительными датами.

Пример 1: сегодня, списание с копейками

Аргументы теста
{"amount": -125050, "currency": "RUB", "at": "2026-10-21T14:05"}, "2026-10-21T15:40"
Ожидается
"Сегодня, 14:05 · −1 250,50 ₽"

Пример 2: вчера, зарплата

Аргументы теста
{"amount": 1500000, "currency": "RUB", "at": "2026-10-20T09:00"}, "2026-10-21T15:40"
Ожидается
"Вчера, 09:00 · +15 000 ₽"
Как проверяем Объявите formatOperation — тест вызывает её сам. Таймеры и Date в тестах ненастоящие: время идёт по команде теста, поэтому setTimeout на 5 секунд проверяется мгновенно. Тестов 10: 2 открыты выше, остальные приходят после старта подхода. Лимит — 2 с на тест.
function formatOperation({ amount, currency, at }, now) // → string
датыстрокиформатирование

Источник: на задачах Альфа-Банка: история операций. Условие пересказано своими словами.