Files
2026-04-06 21:54:09 +02:00

47 lines
1.5 KiB
Dart

const int kAssetDecimals = 8;
const String kDefaultAssetSymbol = 'PEY';
String formatAtomicAmount(int atomic, {int decimals = kAssetDecimals}) {
final isNegative = atomic < 0;
final value = BigInt.from(atomic).abs();
final base = BigInt.from(10).pow(decimals);
final whole = value ~/ base;
final fraction = value % base;
final fractionStr = fraction.toString().padLeft(decimals, '0');
final trimmed = fractionStr.replaceFirst(RegExp(r'0+$'), '');
final result = trimmed.isEmpty ? whole.toString() : '${whole.toString()}.${trimmed}';
return isNegative ? '-$result' : result;
}
int? parseAtomicAmount(String input, {int decimals = kAssetDecimals}) {
final raw = input.trim();
if (raw.isEmpty) {
return null;
}
final normalized = raw.replaceAll(',', '.');
if (normalized.startsWith('-')) {
return null;
}
final parts = normalized.split('.');
if (parts.length > 2) {
return null;
}
final wholePart = parts[0].isEmpty ? '0' : parts[0];
if (!RegExp(r'^\d+$').hasMatch(wholePart)) {
return null;
}
final fractionPart = parts.length == 2 ? parts[1] : '';
if (!RegExp(r'^\d*$').hasMatch(fractionPart)) {
return null;
}
if (fractionPart.length > decimals) {
return null;
}
final paddedFraction = fractionPart.padRight(decimals, '0');
final whole = BigInt.parse(wholePart);
final fraction = paddedFraction.isEmpty ? BigInt.zero : BigInt.parse(paddedFraction);
final base = BigInt.from(10).pow(decimals);
final total = whole * base + fraction;
return total.toInt();
}