@@ -11,7 +11,7 @@ enum SizeUnit {
1111}
1212
1313extension UnitNames on SizeUnit {
14- String getUnitString () {
14+ String getUnitStringRu () {
1515 switch (this ) {
1616 case SizeUnit .byte:
1717 return 'Б' ;
@@ -23,11 +23,28 @@ extension UnitNames on SizeUnit {
2323 return 'ГБ' ;
2424 }
2525 }
26+
27+ String getUnitStringEn () {
28+ switch (this ) {
29+ case SizeUnit .byte:
30+ return 'B' ;
31+ case SizeUnit .kilobyte:
32+ return 'KB' ;
33+ case SizeUnit .megabyte:
34+ return 'MB' ;
35+ case SizeUnit .gigabyte:
36+ return 'GB' ;
37+ }
38+ }
39+
40+ List <String > getAllUnitVariants () => [getUnitStringRu (), getUnitStringEn ()];
2641}
2742
2843class SizeConverter {
2944 static const int _base = 10 ;
30- final Map <SizeUnit ?, num > _coefficients = {
45+ static final String _allUnits =
46+ SizeUnit .values.expand ((unit) => unit.getAllUnitVariants ()).join ('|' );
47+ static final Map <SizeUnit ?, num > _coefficients = {
3148 SizeUnit .byte: pow (_base, 0 ),
3249 SizeUnit .kilobyte: pow (_base, 3 ),
3350 SizeUnit .megabyte: pow (_base, 6 ),
@@ -39,6 +56,40 @@ class SizeConverter {
3956 /// Возвращает единицы измерения, используемые в последней операции
4057 SizeUnit ? get lastUsedUnit => _lastUsedUnit;
4158
59+ /// Парсит строку с размером файла (например, "1.5 ГБ", "100 КБ", "2.3 TB")
60+ /// и возвращает размер в байтах.
61+ ///
62+ /// Поддерживает русские (Б, КБ, МБ, ГБ) и латинские (B, KB, MB, GB) обозначения,
63+ /// а также запятую или точку в качестве десятичного разделителя.
64+ static int parseFileSize (String sizeText) {
65+ final pattern = '([\\ d.,]+)\\ s*($_allUnits )' ;
66+
67+ final regex = RegExp (
68+ pattern,
69+ caseSensitive: false ,
70+ );
71+
72+ final match = regex.firstMatch (sizeText);
73+ if (match == null ) {
74+ return 0 ;
75+ }
76+
77+ final value =
78+ double .tryParse (match.group (1 )? .replaceAll (',' , '.' ) ?? '0' ) ?? 0 ;
79+
80+ final unit = match.group (2 )? .toUpperCase () ?? 'Б' ;
81+
82+ for (final sizeUnit in SizeUnit .values) {
83+ if (sizeUnit.getAllUnitVariants ().any (
84+ (u) => u.toUpperCase () == unit,
85+ )) {
86+ return (value * _coefficients[sizeUnit]! ).toInt ();
87+ }
88+ }
89+
90+ return value.toInt ();
91+ }
92+
4293 /// Преобразует байты в указанные единицы измерения или в наибольшие единицы, в которых целая часть числа не равна 0.
4394 ///
4495 /// [bytes] - кол-во байтов
0 commit comments