feat(proj): init

This commit is contained in:
vl.arkhangelskii
2026-09-21 04:06:43 +03:00
commit c956b94983
1076 changed files with 50876 additions and 0 deletions
+60
View File
@@ -0,0 +1,60 @@
import 'package:intl/intl.dart';
/// `1 234,50 ₽` — same shape as the web cabinet.
String formatMoney(double amount, {String currency = 'RUB', bool compact = false}) {
final symbol = switch (currency) {
'RUB' => '',
'USD' => r'$',
'EUR' => '',
_ => currency,
};
final formatter = compact
? NumberFormat.decimalPattern('ru')
: NumberFormat('#,##0.00', 'ru');
final value = compact ? amount.round() : amount;
return '${formatter.format(value)} $symbol'.replaceAll('\u00A0', ' ');
}
String formatSignedMoney(double amount, {String currency = 'RUB'}) {
final sign = amount < 0 ? '+' : '';
return '$sign${formatMoney(amount.abs(), currency: currency)}';
}
String formatDay(DateTime date) => DateFormat('d MMMM', 'ru').format(date);
String formatShortDate(DateTime date) => DateFormat('dd.MM.yyyy').format(date);
String formatWeekday(DateTime date) => DateFormat('EEEE', 'ru').format(date);
/// `Сегодня` / `Вчера` / `12 сентября` — headers of the journal.
String formatRelativeDay(DateTime date, {DateTime? now}) {
final today = _dayOf(now ?? DateTime.now());
final day = _dayOf(date);
final diff = today.difference(day).inDays;
return switch (diff) {
0 => 'Сегодня',
1 => 'Вчера',
_ => formatDay(day),
};
}
/// `осталось 5 дней` — Russian plural rules.
String formatDaysLeft(int days) {
if (days <= 0) return 'период завершён';
return 'осталось ${plural(days, 'день', 'дня', 'дней')}';
}
String plural(int count, String one, String few, String many) {
final mod100 = count % 100;
final mod10 = count % 10;
if (mod100 >= 11 && mod100 <= 14) return '$count $many';
if (mod10 == 1) return '$count $one';
if (mod10 >= 2 && mod10 <= 4) return '$count $few';
return '$count $many';
}
DateTime _dayOf(DateTime value) => DateTime(value.year, value.month, value.day);