feat(proj): init
This commit is contained in:
@@ -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);
|
||||
Reference in New Issue
Block a user