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


person Shawn Tabrizi    schedule 05.10.2020    source источник


Ответы (1)


Вам нужно будет запросить цепочку для chainDecimals, которая сообщит вам, сколько разрядов в исходном значении вы должны поместить десятичную дробь:

api.registry.chainDecimals

12

Вы можете либо напрямую проанализировать число, разделив его на 10 chainDecimals, либо вы можете использовать служебную функцию 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())
}
person Shawn Tabrizi    schedule 05.10.2020