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

Sha*_*izi 4 substrate polkadot-js

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

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

let account = await api.query.system.account("EGVQCe73TpFyAZx5uKfE1222XfkT3BSKozjgcqzLBnc5eYo");
account.data.free.toHuman()
Run Code Online (Sandbox Code Playgroud)

2.8320kKSM

WhiletoNumber()返回根本没有任何单位的值:

account.data.free.toNumber()
Run Code Online (Sandbox Code Playgroud)

2832057009447293

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

Sha*_*izi 10

您需要在链中查询chainDecimals,它会告诉您应该在原始值中放置小数点的多少位:

api.registry.chainDecimals
Run Code Online (Sandbox Code Playgroud)

12

您可以通过除以 10 chainDecimals来直接解析数字,也可以使用 Polkadot JS 实用函数formatBalance来帮助您更轻松地格式化它:

formatBalance(
    accountData.data.free,
    { withSi: false, forceUnit: '-' },
    chainDecimals
);
Run Code Online (Sandbox Code Playgroud)

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())
}
Run Code Online (Sandbox Code Playgroud)

  • 我认为 `"."+ dm.mod.toString()` 不起作用,因为 mod 不会打印前导零(它们是作为整数的无意义数字)。`formatBalance` 在我的例子中看起来很有用,尽管我很难找到它的文档(这篇文章实际上是“polkadotjs formatBalance”的第一个搜索结果)。“formatBalance”的代码可以在这里找到:https://github.com/polkadot-js/common/blob/master/packages/util/src/format/formatBalance.ts (3认同)