47 lines
1.5 KiB
Dart
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();
|
|
}
|