282 lines
8.8 KiB
Dart
282 lines
8.8 KiB
Dart
import 'dart:io';
|
|
|
|
import 'package:intl/intl.dart';
|
|
|
|
const String localeVN = 'vi_VN';
|
|
const String localeEnUS = 'en_US';
|
|
const String localeFormat = localeVN;
|
|
final NumberFormat _numFormat = NumberFormat("#,###", localeFormat);
|
|
final NumberFormat numFormatDecimal = NumberFormat("#,##0.00", localeFormat);
|
|
final NumberFormat _numFormatCurrency = NumberFormat("###,###,###.##", localeFormat);
|
|
final NumberFormat _numFormatCurrencyDecimal = NumberFormat("###,###.###", localeFormat);
|
|
final NumberFormat _numFormatCurrencyNotDecimal = NumberFormat("###,###,###", localeFormat);
|
|
final DateFormat _dateFormatFull = DateFormat("dd/MM/yyyy HH:mm:ss");
|
|
final DateFormat _dateFormatDMYHHmm = DateFormat("dd/MM/yyyy HH:mm");
|
|
final DateFormat _dateFormatDMY = DateFormat("dd/MM/yyyy");
|
|
final DateFormat _formatYMDHMS = DateFormat("yyyyMMddHHmmss");
|
|
final DateFormat _dateFormatDM = DateFormat("dd/MM");
|
|
final DateFormat _dateFormatY = DateFormat("yyyy");
|
|
final DateFormat _dateFormatM = DateFormat("MM");
|
|
final DateFormat _dateFormatD = DateFormat("dd");
|
|
final DateFormat _dateFormatHours = DateFormat("HH");
|
|
final DateFormat _dateFormatMinute = DateFormat("mm");
|
|
final DateFormat _dateFormatDMYcf = DateFormat("yyyy-MM-ddTHH:mm:ss");
|
|
final DateFormat _dateFormat24h = DateFormat("hh:mm - dd/MM/yyyy");
|
|
final DateFormat _dayFormat24h = DateFormat("hh:mm - dd/MM");
|
|
final NumberFormat numFormatter = NumberFormat("#,##0", localeFormat);
|
|
final DateFormat formatDate = DateFormat("dd-MM-yyyy");
|
|
final DateFormat formatHours = DateFormat("hh:mm a");
|
|
final DateFormat formatDateTime = DateFormat("hh:mm a dd/MM/yyyy");
|
|
final DateFormat _formatMMMYYYY = DateFormat("MMMM yyyy");
|
|
final DateFormat _formatMMYYYY = DateFormat("MM/yyyy");
|
|
final DateFormat _formatEEE = DateFormat("EEE");
|
|
final DateFormat _formatWithOutYY = DateFormat("HH:mm dd MMM");
|
|
final DateFormat formatime24h = DateFormat("HH:mm");
|
|
final DateFormat formaDuration = DateFormat("HH:mm:ss");
|
|
final DateFormat formatDMYHHmm = DateFormat("dd/MM/yyyy HH:mm");
|
|
final DateFormat _dateFormatYMD = DateFormat("yyyy-MM-dd");
|
|
final DateFormat _dateFormatHours24h = DateFormat("HH");
|
|
|
|
extension StringExtension on String {
|
|
String get capitalize => this.isNullOrEmpty ? "" : '${this[0].toUpperCase()}${substring(1)}';
|
|
|
|
String get firstLowerCase => this.isNullOrEmpty ? "" : '${this[0].toLowerCase()}${substring(1)}';
|
|
String get firstUpCase => this.isNullOrEmpty ? "" : '${this[0].toUpperCase()}${substring(1)}';
|
|
|
|
String get capitalizeFirstofEach =>
|
|
replaceAll(RegExp(' +'), ' ').split(" ").map((String str) => str.capitalize).join(" ");
|
|
|
|
String get numFormatCurrencyDecimal => _numFormatCurrencyDecimal.format((toInt ?? 0).truncate());
|
|
|
|
String get camelCase => replaceAll("-", " ").split(" ").map((String str) => str.capitalize).join().firstLowerCase;
|
|
}
|
|
|
|
extension StringNullExtension on String? {
|
|
bool get isNullOrEmpty => this == null || this!.isEmpty;
|
|
}
|
|
|
|
const _kb = 1024;
|
|
const _M = 1000000;
|
|
//exp: 1%
|
|
const _minRate = 1;
|
|
|
|
extension Nilly on num {
|
|
num get safeNum => this;
|
|
|
|
num roundAsFixed(int frag) {
|
|
return toStringAsFixed(frag).strSafeNum;
|
|
}
|
|
|
|
num get safePeriodMonth {
|
|
final n = this;
|
|
final x = (n == 0) ? 12 : n;
|
|
return x;
|
|
}
|
|
|
|
//109.139.000 -> '109,14'
|
|
//90.000.000 -> '90'
|
|
//90.123.000 -> '90,12'
|
|
//### 900.123 -> '900.123' //hâm => 900 tỉ 123 triệu
|
|
//### min: _M
|
|
//------------
|
|
//9,012 -> '9,01'
|
|
//90,812 -> '90,81'
|
|
//90,689 -> '90,69'
|
|
//90 -> '90'
|
|
//999 -> '999'
|
|
//999,123 -> '999,12'
|
|
//999,999 -> '999,99'
|
|
//max: 999,999 (because: 1000 triệu, hâm)
|
|
String get millionFormat {
|
|
final n = safeNum;
|
|
final d = (n >= _M) ? (n / _M) : n;
|
|
return d._decimalFormat();
|
|
}
|
|
|
|
String pad({int pad = 2}) {
|
|
return safeNum.toString().padLeft(2, '0');
|
|
}
|
|
|
|
String get mbFormat {
|
|
final n = safeNum / _kb;
|
|
return "${n._decimalFormat()} Mb";
|
|
}
|
|
|
|
String get sign => safeNum >= 0 ? "+" : "";
|
|
|
|
String get currencyFormat => _numFormatCurrency.format(safeNum);
|
|
|
|
String get currencyFormatNotDecimal => _numFormatCurrencyNotDecimal.format(safeNum);
|
|
|
|
//for int, x >= 1000
|
|
String get numFormat => _numFormat.format(safeNum);
|
|
|
|
//đã chia cho total
|
|
//=> nhân với 100
|
|
String get dividedPercentFormat {
|
|
//return "${(safeNum * 100)}%";
|
|
return "${(safeNum * 100)._decimalFormat()}%";
|
|
}
|
|
|
|
//for double, nullable
|
|
String get percentFormat {
|
|
return "${safeNum._decimalFormat()}%";
|
|
}
|
|
|
|
String get interestRateFormat {
|
|
return "${_real._decimalFormat()}%";
|
|
}
|
|
|
|
//có thể đã đc api chia 100
|
|
//0.9 => 90
|
|
//0.2 => 20
|
|
//1.1 => 1.1
|
|
//12 => 12
|
|
num get _real {
|
|
final n = safeNum;
|
|
return (n >= _minRate) ? n : n * 100;
|
|
}
|
|
|
|
//for double not null
|
|
String _decimalFormat({int fix = 1}) =>
|
|
(this is int) ? numFormat : _numFormatCurrency.format(double.parse(toStringAsFixed(fix)));
|
|
|
|
String get signNumFormat => "$sign$numFormat";
|
|
}
|
|
|
|
extension Dilly on DateTime? {
|
|
String get formatDuration => (this != null) ? formaDuration.format(this!) : "";
|
|
|
|
String get formatDM => (this != null) ? _dateFormatDM.format(this!) : "";
|
|
|
|
String get formatYY => (this != null) ? _dateFormatY.format(this!) : "";
|
|
|
|
String get formatMM => (this != null) ? _dateFormatM.format(this!) : "";
|
|
|
|
String get formatDD => (this != null) ? _dateFormatD.format(this!) : "";
|
|
|
|
String get formatDMY => (this != null) ? _dateFormatDMY.format(this!) : "";
|
|
|
|
String get formatYMDHMS => (this != null) ? _formatYMDHMS.format(this!) : "";
|
|
|
|
String get formatDMYHHmm => (this != null) ? _dateFormatDMYHHmm.format(this!) : "";
|
|
|
|
String get formatFull => (this != null) ? _dateFormatFull.format(this!) : "";
|
|
|
|
String get format24h => (this != null) ? _dateFormat24h.format(this!) : "";
|
|
|
|
String get formatDateHoursMinute => (this != null) ? formatime24h.format(this!) : "";
|
|
|
|
String get formatdHMDM => (this != null) ? _dayFormat24h.format(this!) : "";
|
|
|
|
String get formatDateHours => (this != null) ? _dateFormatHours.format(this!) : "";
|
|
|
|
String get formatDateHours24h => (this != null) ? _dateFormatHours24h.format(this!) : "";
|
|
|
|
String get formatDateMinute => (this != null) ? _dateFormatMinute.format(this!) : "";
|
|
|
|
String get formatMMMYYYY => (this != null) ? _formatMMMYYYY.format(this!) : "";
|
|
|
|
String get formatEEE => (this != null) ? _formatEEE.format(this!) : "";
|
|
|
|
String get formatMMYYYY => (this != null) ? _formatMMYYYY.format(this!) : "";
|
|
|
|
String get formatWithOutYY => (this != null) ? _formatWithOutYY.format(this!) : "";
|
|
|
|
String get formatYMD => (this != null) ? _dateFormatYMD.format(this!) : "";
|
|
|
|
String get chatTime {
|
|
if (this == null) return '';
|
|
final DateTime now = DateTime.now();
|
|
if (now.formatDMY == this.formatDMY) {
|
|
return formatHours.format(this!);
|
|
}
|
|
return DateFormat("hh:mm a dd/MM").format(this!);
|
|
}
|
|
}
|
|
|
|
const pdf = '.pdf';
|
|
|
|
extension Silly on String? {
|
|
String? get unBreak => this != null ? this!.replaceAll('\n', '') : null;
|
|
|
|
bool isPdf({bool get = false}) {
|
|
final url = this != null ? this!.toLowerCase() : null;
|
|
return get || !Platform.isIOS ? url?.contains(pdf) ?? false : url?.endsWith(pdf) ?? false;
|
|
}
|
|
|
|
String get toPdfPath {
|
|
var path = this != null ? this!.substring(this!.lastIndexOf("://") + 1).replaceAll("/", "_") : "";
|
|
if (!path.isPdf()) path += pdf;
|
|
return path;
|
|
}
|
|
|
|
//f: formatted
|
|
int? get fToInt => int.tryParse(this!.replaceAll(",", ""))?.safeNum as int;
|
|
|
|
int get trimLength => this?.replaceAll(' ', '').length ?? 0;
|
|
|
|
int get safeLength => this?.length ?? 0;
|
|
|
|
String get spreadFormat => "${this} m2";
|
|
|
|
//2020-03-15T09:21:26.000Z
|
|
DateTime? get strToDateCf {
|
|
return isNullOrEmpty ? null : _dateFormatDMYcf.parse(this!);
|
|
}
|
|
|
|
DateTime? get strToDate {
|
|
return isNullOrEmpty ? null : _dateFormatDMY.parse(this!);
|
|
}
|
|
|
|
String get parenthesesFormat => "($this)";
|
|
|
|
int? get toInt => this != null ? int.tryParse(this!) : null;
|
|
|
|
String? get formatPhoneNumber {
|
|
var phone = this;
|
|
if (phone != null) {
|
|
if (phone.startsWith("+84")) return phone;
|
|
phone = this!.replaceAll("[^\\d.]", "");
|
|
if (phone.startsWith('0')) {
|
|
phone = this!.replaceFirst('0', '84');
|
|
}
|
|
final builder = StringBuffer();
|
|
builder.write('+');
|
|
if (phone.startsWith('84')) {
|
|
builder.write(phone);
|
|
} else {
|
|
builder
|
|
..write('84')
|
|
..write(phone);
|
|
}
|
|
return builder.toString();
|
|
}
|
|
return null;
|
|
}
|
|
|
|
String? get correctUrl {
|
|
final url = this;
|
|
if (url != null) {
|
|
var start = url.indexOf("http://");
|
|
if (start < 0) start = url.indexOf("https://");
|
|
return start <= 0 ? url : url.substring(start);
|
|
}
|
|
return null;
|
|
}
|
|
|
|
String get strDecimal {
|
|
return strSafeNum._decimalFormat();
|
|
}
|
|
|
|
num get strSafeNum {
|
|
if (isNullOrEmpty) return 0;
|
|
return double.tryParse(this!)!.safeNum;
|
|
}
|
|
|
|
String get normalSearchText {
|
|
if (this == null) return '';
|
|
return this!.trim().toLowerCase();
|
|
}
|
|
}
|