From 2ce9f1a776ea3168438fa2bdfcac90b35492e8ac Mon Sep 17 00:00:00 2001 From: Zac Mitton Date: Wed, 25 May 2016 18:29:03 -0700 Subject: [PATCH] correctly displaying small balances with tests --- test/unit/util_test.js | 35 +++++++++++++++++++++---- ui/app/components/eth-balance.js | 12 ++------- ui/app/util.js | 44 ++++++++++++++++++++------------ 3 files changed, 60 insertions(+), 31 deletions(-) diff --git a/test/unit/util_test.js b/test/unit/util_test.js index b091d5bc7..f003395b3 100644 --- a/test/unit/util_test.js +++ b/test/unit/util_test.js @@ -17,6 +17,21 @@ describe('util', function() { this.sinon.restore() }) + describe('parseBalance', function() { + it('should render 0.01 eth correctly', function() { + const input = '0x2386F26FC10000' + const output = util.parseBalance(input) + assert.deepEqual(output, ['0', '01']) + }) + }) + describe('parseBalance', function() { + it('should render 0.01 eth correctly', function() { + const input = 'A6DA46CCA6858000' + const output = util.parseBalance(input) + assert.deepEqual(output, ['12', '023']) + }) + }) + describe('addressSummary', function() { it('should add case-sensitive checksum', function() { var address = '0xfdea65c8e26263f6d9a1b5de9555d2931a33b825' @@ -111,20 +126,30 @@ describe('util', function() { it('should return eth as string followed by ETH', function() { var input = new ethUtil.BN(ethInWei, 10).toJSON() - var result = util.formatBalance(input) + var result = util.formatBalance(input, 4) 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, '0.5000 ETH') + var result = util.formatBalance(input, 3) + assert.equal(result, '0.500 ETH') }) - it('should display four decimal points', function() { + it('should display specified decimal points', function() { + var input = "0x128dfa6a90b28000" + var result = util.formatBalance(input, 2) + assert.equal(result, '1.33 ETH') + }) + it('should default to 3 decimal points', function() { var input = "0x128dfa6a90b28000" var result = util.formatBalance(input) - assert.equal(result, '1.3370 ETH') + assert.equal(result, '1.337 ETH') + }) + it('should show 2 significant digits for tiny balances', function() { + var input = "0x1230fa6a90b28" + var result = util.formatBalance(input) + assert.equal(result, '0.00032 ETH') }) }) diff --git a/ui/app/components/eth-balance.js b/ui/app/components/eth-balance.js index 3f88ef2d4..76b75d4c8 100644 --- a/ui/app/components/eth-balance.js +++ b/ui/app/components/eth-balance.js @@ -2,6 +2,7 @@ const Component = require('react').Component const h = require('react-hyperscript') const inherits = require('util').inherits const parseBalance = require('../util').parseBalance +const formatBalance = require('../util').formatBalance module.exports = EthBalanceComponent @@ -12,11 +13,8 @@ function EthBalanceComponent() { EthBalanceComponent.prototype.render = function() { var state = this.props - var parsedAmount = parseBalance(state.value) - var beforeDecimal = parsedAmount[0] - var afterDecimal = parsedAmount[1] - var value = beforeDecimal+(afterDecimal ? '.'+afterDecimal : '') var style = state.style + var value = formatBalance(state.value) return ( @@ -28,12 +26,6 @@ EthBalanceComponent.prototype.render = function() { display: 'inline', }, }, value), - h('.ether-balance-label', { - style: { - display: 'inline', - marginLeft: 6, - }, - }, 'ETH'), ]) ) diff --git a/ui/app/util.js b/ui/app/util.js index 81a029350..91f85e43f 100644 --- a/ui/app/util.js +++ b/ui/app/util.js @@ -84,29 +84,41 @@ function weiToEth(bn) { } // Takes hex, returns [beforeDecimal, afterDecimal] -function parseBalance(balance, decimalsToKeep) { - if (decimalsToKeep === undefined) decimalsToKeep = 4 - if (!balance || balance === '0x0') return ['0', ''] - var wei = numericBalance(balance) - var padded = wei.toString(10) - var len = padded.length - var match = padded.match(/[^0]/) - var nonZeroIndex = match && match.index - var beforeDecimal = padded.substr(nonZeroIndex ? nonZeroIndex : 0, len - 18) || '0' - var afterDecimal = padded.substr(len - 18, decimalsToKeep) +function parseBalance(balance) { + if (!balance || balance === '0x0') return ['0', '0'] + var wei = numericBalance(balance).toString(10) + var eth = String(wei/valueTable['wei']) + var beforeDecimal = String(Math.floor(eth)) + var afterDecimal + if(eth.indexOf('.') > -1){ + afterDecimal = eth.slice(eth.indexOf('.') + 1) + }else{ + afterDecimal = '0' + } return [beforeDecimal, afterDecimal] } // Takes wei hex, returns "None" or "${formattedAmount} ETH" -function formatBalance(balance) { +function formatBalance(balance, decimalsToKeep) { var parsed = parseBalance(balance) var beforeDecimal = parsed[0] var afterDecimal = parsed[1] - if (beforeDecimal === '0' && afterDecimal === '') return 'None' - var result = beforeDecimal - if (afterDecimal) result += '.'+afterDecimal - result += ' ETH' - return result + var formatted = "None" + if(decimalsToKeep === undefined){ + if(beforeDecimal === '0'){ + if(afterDecimal !== '0'){ + var sigFigs = afterDecimal.match(/^0*(.{2})/) //default: grabs 2 most significant digits + if(sigFigs){afterDecimal = sigFigs[0]} + formatted = '0.' + afterDecimal + ' ETH' + } + }else{ + formatted = beforeDecimal + "." + afterDecimal.slice(0,3) + ' ETH' + } + }else{ + afterDecimal += Array(decimalsToKeep).join("0") + formatted = beforeDecimal + "." + afterDecimal.slice(0,decimalsToKeep) + ' ETH' + } + return formatted } function dataSize(data) {