Как вы форматируете балансы с помощью Polkadot JS API?
Я хотел бы получить баланс пользователя, отформатированного с использованием базовой единицы цепочки субстратов.
Когда я использую
toHuman()
, Я получаю самоуверенное форматирование, которое включает такой префикс:
let account = await api.query.system.account("EGVQCe73TpFyAZx5uKfE1222XfkT3BSKozjgcqzLBnc5eYo");
account.data.free.toHuman()
2,8320 кКСМ
В то время как
toNumber()
возвращает значение без каких-либо единиц:
account.data.free.toNumber()
2832057009447293
Как мне получить это значение, используя только базовые единицы, используя Polkadot JS API?
1 ответ
Вам нужно будет запросить цепочку для
chainDecimals
, который скажет вам, сколько разрядов в исходном значении вы должны поместить десятичную дробь:
api.registry.chainDecimals
12
Вы можете либо непосредственно проанализировать число, разделив его на 10chainDecimals, либо использовать служебную функцию Polkadot JS
formatBalance
чтобы упростить форматирование:
formatBalance(
accountData.data.free,
{ withSi: false, forceUnit: '-' },
chainDecimals
);
2 832,057
В итоге я создал такую служебную функцию:
function toUnit(balance, decimals) {
base = new BN(10).pow(new BN(decimals));
dm = new BN(balance).divmod(base);
return parseFloat(dm.div.toString() + "." + dm.mod.toString())
}