THATMobile/lib/core/extension/string_extension.dart
2026-02-26 10:39:42 +07:00

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();
}
}