| 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 | } |