/
aaronair
/
Test_task_rt_solution
Обзор
Документация
Войти
/
aaronair
/
Test_task_rt_solution
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/lib/format.ts
104 строки
3 KB
Ilikedrinkpivo
first_commit
28 май 2026, 14:51
28 май 2026, 14:51
b4498fc
Код
Авторство
О чём код?
export function formatDate(iso: string): string { const d = new Date(iso); if (Number.isNaN(d.getTime())) return iso; return d.toLocaleDateString("ru-RU", { day: "2-digit", month: "long", year: "numeric", }); } export function formatDateTime(iso: string): string { const d = new Date(iso); if (Number.isNaN(d.getTime())) return iso; return d.toLocaleString("ru-RU", { day: "2-digit", month: "long", year: "numeric", hour: "2-digit", minute: "2-digit", }); } export function pluralize( n: number, forms: [string, string, string], ): string { const abs = Math.abs(n) % 100; const mod10 = abs % 10; if (abs > 10 && abs < 20) return forms[2]; if (mod10 > 1 && mod10 < 5) return forms[1]; if (mod10 === 1) return forms[0]; return forms[2]; } export function formatFileSize(sizeKb: number): string { if (sizeKb < 1024) return `${sizeKb} КБ`; return `${(sizeKb / 1024).toFixed(1)} МБ`; } export function formatQuarter(iso: string | undefined): string | null { if (!iso) return null; const d = new Date(iso); if (Number.isNaN(d.getTime())) return null; const q = Math.floor(d.getMonth() / 3) + 1; return `Q${q} ${d.getFullYear()}`; } export function getQuarterKey(iso: string | undefined): string | null { if (!iso) return null; const d = new Date(iso); if (Number.isNaN(d.getTime())) return null; const q = Math.floor(d.getMonth() / 3) + 1; return `${d.getFullYear()}-Q${q}`; } export function getYearAndQuarter( iso: string | undefined, ): { year: number; quarter: number } | null { if (!iso) return null; const d = new Date(iso); if (Number.isNaN(d.getTime())) return null; return { year: d.getFullYear(), quarter: Math.floor(d.getMonth() / 3) + 1, }; } export function formatMonthYear(iso: string | undefined): string | null { if (!iso) return null; const d = new Date(iso); if (Number.isNaN(d.getTime())) return null; return d.toLocaleDateString("ru-RU", { month: "long", year: "numeric" }); } /** Форматирует число в млн для отображения; null/0 — не показывать */ export function formatMillions(value: number | null | undefined): string | null { if (value == null || value === 0) return null; return `${value} млн`; } export function countWords(text: string): number { return text.trim().split(/\s+/).filter(Boolean).length; } export function slugifyName(name: string): string { const map: Record<string, string> = { а: "a", б: "b", в: "v", г: "g", д: "d", е: "e", ё: "e", ж: "zh", з: "z", и: "i", й: "y", к: "k", л: "l", м: "m", н: "n", о: "o", п: "p", р: "r", с: "s", т: "t", у: "u", ф: "f", х: "h", ц: "ts", ч: "ch", ш: "sh", щ: "sch", ъ: "", ы: "y", ь: "", э: "e", ю: "yu", я: "ya", }; return name .toLowerCase() .split(/\s+/) .map((part) => part .split("") .map((c) => map[c] ?? c) .join(""), ) .join("-") .replace(/[^a-z0-9-]/g, "") .replace(/-+/g, "-"); }