substrate - 你如何使用 Polkadot JS API 格式化余额?
问题描述
我想使用 Substrate 链的基本单元格式化用户的余额。
当我使用 时toHuman()
,我会得到一个自以为是的格式,其中包含如下前缀:
let account = await api.query.system.account("EGVQCe73TpFyAZx5uKfE1222XfkT3BSKozjgcqzLBnc5eYo");
account.data.free.toHuman()
2.8320 kKSM
WhiletoNumber()
完全返回没有任何单位的值:
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())
}
推荐阅读
- r - R:从两个列表创建一个数据框
- sql-server - 在 select 语句中使用 like vs charindex 的性能差异是什么?
- c++ - 类对象中的对象向量和指针 - 核心转储(分段错误)
- mysql - 将列名作为参数传递的存储过程
- java - 线程和多线程
- c# - Visual Studio - 代码片段错误/不工作 AgumentNullException
- c - 如何在我的问题中访问单元格的压力值并使用 UDF 在 Ansys fluent 中将其设置为零?
- sql - 在 spark df 中加载增量数据文件
- flutter - 如何解决“无法无条件调用运算符'{0}',因为接收者可以为'null'”
- operating-system - 现代操作系统如何工作以及如何从头开始制作一个?