dev
dart 77 lines 2.19 KB
Raw
1 import 'package:intl/intl.dart';
2
3 double cryptoAmountToDouble({required num amount, required num divider}) => amount / divider;
4
5 extension MaxDecimals on String {
6 String withMaxDecimals(int maxDecimals) {
7 var parts = split(".");
8
9 if (parts.length > 2) {
10 parts = [parts.first, parts.sublist(1, parts.length).join("")];
11 }
12
13 if (parts.length == 2 && parts[1].length > maxDecimals) {
14 parts[1] = parts[1].substring(0, maxDecimals);
15 }
16
17 return parts.join(".");
18 }
19
20 String withDecimals(int decimals) {
21 var parts = split(".");
22
23 if (parts.length > 2) {
24 parts = [parts.first, parts.sublist(1).join("")];
25 }
26
27 if (parts.length == 1) {
28 parts.add("");
29 }
30
31 if (parts[1].length > decimals) {
32 parts[1] = parts[1].substring(0, decimals);
33 } else {
34 parts[1] = parts[1].padRight(decimals, '0');
35 }
36
37 return parts.join(".");
38 }
39
40 /// Format a stringified number to a localized representation
41 /// 1.000.000,00 in de_DE
42 /// 1’000’000.00 in de_CH
43 /// 1,000,000.00 in en_US
44 ///
45 /// Can also handle amounts suffixed with a Symbol
46 /// 1.000.000,00 XMR in de_DE
47 /// 1’000’000.00 XMR in de_CH
48 /// 1,000,000.00 XMR in en_US
49 ///
50 /// Can also handle amounts prefixed with a size relational operator
51 /// < 1.000.000,00 XMR in de_DE
52 /// > 1’000’000.00 XMR in de_CH
53 /// < 1,000,000.00 XMR in en_US
54 ///
55 /// DO NOT PARSE THE LOCALIZED STRING TO A NUMBER IF YOU WANT TO KEEP YOUR SANITY!
56 String withLocalSeperator([String? locale]) {
57 if (contains(" ")) {
58 final parts = split(" ");
59
60 if ([">", "<"].contains(parts.first)) {
61 final result = [parts.first, parts[1].withLocalSeperator(locale)];
62 if (parts.length > 2) result.addAll(parts.sublist(2));
63
64 return result.join(" ");
65 }
66
67 return [parts.first.withLocalSeperator(locale), ...parts.sublist(1)].join(" ");
68 }
69
70 final formater = NumberFormat("#,###", locale);
71 final parts = replaceAll(",", "").split(".");
72 if (parts.first.contains("< 0")) parts.first = "0";
73
74 return [formater.format(int.tryParse(parts.first) ?? 0), ...parts.sublist(1)]
75 .join(formater.symbols.DECIMAL_SEP);
76 }
77 }