I have written an ERC20 token contract and deployed it in test network using truffle framework. When I check the token balance for an account using web3 it was giving the result in BigNumber when I try to convert it to a number using toNumber() getting an unexpected result.
Solidity code:
function balanceOf(address _from) constant public returns (uint256 balance) {
return balances[_from];
}
Javascript code:
instantiateBalance() {
const contract = require('truffle-contract')
const token = contract(Token)
token.setProvider(this.state.web3.currentProvider)
var tokenInstance;
token.deployed().then(function(instance) {
tokenInstance = instance;
return tokenInstance.balanceOf.call("0xb1Cf866ced575FD1A1997Daa5d6F099efb282E41", {from: "0xb1Cf866ced575FD1A1997Daa5d6F099efb282E41"});
}).then(function(balance) {
console.log(balance.toNumber());
})
Expected Result
Decimals = 18
Actual Token Balance = 100000000.000000000000000000
Actual Result
Token Balance = 1000000000000
Best Answer
If your token have 18 decimals
like an ether you can use
Use fromWei to convert your bigNumber to ether and then convert it to Number. Be aware that unnecessary 0 after the floating point will not be displayed.
In web3 ^1.0 it may change to
web3.utils.fromWei
instead ofweb3.fromWei
doc. Note that truffle ^5.0 uses web3 ^1.0.If you have a different token decimal
Let's say 6. You'll have to do the conversion manually with something like: