【问题标题】:How do you format balances with the Polkadot JS API?你如何使用 Polkadot JS API 格式化余额?
【发布时间】:2020-10-05 14:30:34
【问题描述】:

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

当我使用 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 仅使用基本单位获取此值?

【问题讨论】:

    标签: substrate polkadot-js


    【解决方案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())
    }
    

    【讨论】:

    • 我认为 "."+ dm.mod.toString() 不起作用,因为 mod 不会打印前导零(它们是整数的无意义数字)。 formatBalance 在我的情况下看起来很有用,尽管我很难找到它的文档(这篇文章实际上是“polkadotjs formatBalance”的第一次搜索命中)。 formatBalance 的代码可以在这里找到:github.com/polkadot-js/common/blob/master/packages/util/src/…
    猜你喜欢
    • 2021-06-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多