How to convert BigNumber to Number in Truffle framework?

  • 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

    Result:

    did you try balance.div(1e18) or balance.toNumber().div(1e18) ?

    balance.div(1e18) will give me the digits before the decimal point. I need digits after decimal point also to display exact balance.

  • Crema

    Crema Correct answer

    4 years ago

    If your token have 18 decimals

    like an ether you can use

    then(function(balance) {
        console.log(web3.fromWei(balance.toNumber(), "ether" ) );
    })
    

    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 of web3.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:

    var tokenBalance = balance.ToNumber() / Math.pow(10, tokenDecimals)
    

    I experienced a problem with this example, if the balance had 18 decimals it would strip it back to 16. To fix this I used `web3.fromWei(balance.toString(), "ether")`, notice `.toString()`. I'm unsure if this is best practice.

    yes using toString() worked for me as well, when I used toNumber(), it gave me an error because we can not store that big number in that data type I think.

    ToNumber not a function in truffle

    @PhilipRego this was answered 3 years ago. It's obvious it changed now.

License under CC-BY-SA with attribution


Content dated before 7/24/2021 11:53 AM