问题描述
我希望获得使用底物链基本单位格式化的用户的余额。
当我使用toHuman()
时,我得到一种自以为是的格式,其中包括这样的前缀:
let account = await api.query.system.account("EGVQCe73TpFyAZx5uKfE1222XfkT3BSKozjgcqzLBnc5eYo");
account.data.free.toHuman()
2.8320 kKSM
toNumber()
返回的值根本不带任何单位:
account.data.free.toNumber()
2832057009447293
如何使用Polkadot JS API仅使用基本单位获得此值?
解决方法
您将需要在链中查询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())
}