Как вы форматируете балансы с помощью 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())
}
Другие вопросы по тегам