60 lines
1.7 KiB
Dart
60 lines
1.7 KiB
Dart
|
|
import 'package:intl/intl.dart';
|
|||
|
|
|
|||
|
|
/// 通用格式化工具。
|
|||
|
|
class Formatters {
|
|||
|
|
Formatters._();
|
|||
|
|
|
|||
|
|
static final DateFormat _dateTimeFormat = DateFormat('yyyy-MM-dd HH:mm:ss');
|
|||
|
|
static final DateFormat _dateFormat = DateFormat('yyyy-MM-dd');
|
|||
|
|
|
|||
|
|
/// 格式化日期时间。
|
|||
|
|
static String formatDateTime(DateTime value) {
|
|||
|
|
return _dateTimeFormat.format(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 仅格式化日期(YYYY-MM-DD),用于门店到期时间等只需日期的场景。
|
|||
|
|
static String formatDate(DateTime value) {
|
|||
|
|
return _dateFormat.format(value);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 将百分比值格式化为带一位小数的字符串,如 `72.5%`。
|
|||
|
|
static String formatPercent(double ratio) {
|
|||
|
|
return '${(ratio * 100).toStringAsFixed(1)}%';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 将字节数格式化为可读单位(KB/MB/GB/TB)。
|
|||
|
|
static String formatBytes(int bytes) {
|
|||
|
|
if (bytes < 1024) {
|
|||
|
|
return '$bytes B';
|
|||
|
|
}
|
|||
|
|
const units = ['KB', 'MB', 'GB', 'TB'];
|
|||
|
|
double value = bytes.toDouble();
|
|||
|
|
int unitIndex = -1;
|
|||
|
|
do {
|
|||
|
|
value /= 1024;
|
|||
|
|
unitIndex++;
|
|||
|
|
} while (value >= 1024 && unitIndex < units.length - 1);
|
|||
|
|
return '${value.toStringAsFixed(1)} ${units[unitIndex]}';
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
/// 将秒数格式化为运行时长字符串,如 `3天 5小时 12分`。
|
|||
|
|
static String formatUptime(int seconds) {
|
|||
|
|
final duration = Duration(seconds: seconds);
|
|||
|
|
final days = duration.inDays;
|
|||
|
|
final hours = duration.inHours % 24;
|
|||
|
|
final minutes = duration.inMinutes % 60;
|
|||
|
|
|
|||
|
|
final parts = <String>[];
|
|||
|
|
if (days > 0) {
|
|||
|
|
parts.add('$days天');
|
|||
|
|
}
|
|||
|
|
if (hours > 0) {
|
|||
|
|
parts.add('$hours小时');
|
|||
|
|
}
|
|||
|
|
if (minutes > 0 || parts.isEmpty) {
|
|||
|
|
parts.add('$minutes分');
|
|||
|
|
}
|
|||
|
|
return parts.join(' ');
|
|||
|
|
}
|
|||
|
|
}
|