您如何使用 Polkadot JS API 格式化余额?

How do you format balances with the Polkadot JS API?

我想获取使用 Substrate 链的基本单元格式化的用户余额。

当我使用 toHuman() 时,我得到了一种固执己见的格式,其中包含如下前缀:

let account = await api.query.system.account("EGVQCe73TpFyAZx5uKfE1222XfkT3BSKozjgcqzLBnc5eYo");
account.data.free.toHuman()

2.8320 kKSM

toNumber() returns 没有任何单位的值:

account.data.free.toNumber()

2832057009447293

如何使用 Polkadot JS API 仅使用基本单位来获取此值?

您将需要查询 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())
}