Fix eth resolution

utils.formatBalance was returning rounded ether, was not useful for displaying account balances.

Now returns four decimal points, and is easily configurable for more, with passing tests.

Spoiler alert:  Don't you dare divide bignumber wei. Bignumber does not have decimals. Keep it as wei, format it as ether.
This commit is contained in:
Dan Finlay 2016-04-14 13:20:19 -07:00
parent 5694a11672
commit 8527d051b0
2 changed files with 21 additions and 4 deletions

View File

@ -64,11 +64,16 @@ function weiToEth(bn) {
return eth
}
var decimalsToKeep = 4
function formatBalance(balance) {
if (!balance) return 'None'
var wei = numericBalance(balance)
var eth = weiToEth(wei)
return eth.toString(10) + ' ETH'
var padded = wei.toString(10)
var len = padded.length
var nonZeroIndex = padded.match(/[^0]/).index
var beforeDecimal = padded.substr(nonZeroIndex ? nonZeroIndex : 0, len - 18)
var afterDecimal = padded.substr(len - 18, decimalsToKeep)
return `${beforeDecimal}.${afterDecimal} ETH`
}
function dataSize(data) {

View File

@ -63,9 +63,21 @@ describe('util', function() {
})
it('should return eth as string followed by ETH', function() {
var input = new ethUtil.BN(ethInWei).toJSON()
var input = new ethUtil.BN(ethInWei, 10).toJSON()
var result = util.formatBalance(input)
assert.equal(result, '1 ETH')
assert.equal(result, '1.0000 ETH')
})
it('should return eth as string followed by ETH', function() {
var input = new ethUtil.BN(ethInWei, 10).div(new ethUtil.BN('2', 10)).toJSON()
var result = util.formatBalance(input)
assert.equal(result, '.5000 ETH')
})
it('should display four decimal points', function() {
var input = "0x128dfa6a90b28000"
var result = util.formatBalance(input)
assert.equal(result, '1.3370 ETH')
})
})