dev
dart 49 lines 1.7 KB
Raw
1 class AmountConverter {
2 static String toBaseUnits(String amount, int decimals) {
3 amount = amount.trim();
4 if (amount.isEmpty) return '0';
5
6 final neg = amount.startsWith('-');
7 if (neg) amount = amount.substring(1);
8
9 amount = amount.replaceAll(',', '');
10 final parts = amount.split('.');
11 final whole = parts[0].isEmpty ? '0' : parts[0];
12 final frac = parts.length > 1 ? parts[1] : '';
13
14 final fracPadded = (frac + '0' * decimals).substring(0, decimals);
15
16 final pow10 = BigInt.from(10).pow(decimals);
17 final wholeBI = BigInt.parse(whole);
18 final fracBI = fracPadded.isEmpty ? BigInt.zero : BigInt.parse(fracPadded);
19
20 final res = wholeBI * pow10 + fracBI;
21 return neg ? '-${res.toString()}' : res.toString();
22 }
23
24 static String fromBaseUnits(String units, int decimals) {
25 units = units.trim();
26 if (units.isEmpty) return '0';
27
28 final neg = units.startsWith('-');
29 if (neg) units = units.substring(1);
30
31 if (decimals == 0) return neg ? '-$units' : units;
32
33 // pad if shorter than decimals
34 if (units.length <= decimals) {
35 final s = units.padLeft(decimals + 1, '0'); // ensures at least "0xxxx"
36 final intPart = s.substring(0, s.length - decimals);
37 var fracPart = s.substring(s.length - decimals);
38 fracPart = fracPart.replaceFirst(RegExp(r'0+$'), '');
39 final out = fracPart.isEmpty ? intPart : '$intPart.$fracPart';
40 return neg ? '-$out' : out;
41 }
42
43 final intPart = units.substring(0, units.length - decimals);
44 var fracPart = units.substring(units.length - decimals);
45 fracPart = fracPart.replaceFirst(RegExp(r'0+$'), '');
46 final out = fracPart.isEmpty ? intPart : '$intPart.$fracPart';
47 return neg ? '-$out' : out;
48 }
49 }