util/util: helper parseValue() converts bitcoin decimals into bigint

This commit is contained in:
Jeff Garzik 2013-09-14 22:59:29 -04:00
parent fde1cb75a5
commit da5719249f
3 changed files with 69 additions and 0 deletions

View File

@ -5,6 +5,7 @@ var Address = require('../Address').class();
var PrivateKey = require('../PrivateKey').class();
var networks = require('../networks');
var KeyModule = require('../Key');
var coinUtil = require('../util/util');
suite('basic');
@ -110,8 +111,22 @@ function is_invalid(datum)
assert.equal(valid, false);
}
function test_value(datum)
{
if (datum.length != 2)
throw new Error("Bad test");
var decimal = datum[0];
var intStr = datum[1];
var bn = coinUtil.parseValue(decimal);
assert.notEqual(bn, undefined);
assert.equal(bn.toString(), intStr);
}
var dataValid = JSON.parse(fs.readFileSync('test/base58_keys_valid.json'));
var dataInvalid = JSON.parse(fs.readFileSync('test/base58_keys_invalid.json'));
var dataValues = JSON.parse(fs.readFileSync('test/values.json'));
test('valid', function() {
dataValid.forEach(function(datum) { is_valid(datum); });
@ -121,3 +136,7 @@ test('invalid', function() {
dataInvalid.forEach(function(datum) { is_invalid(datum); });
});
test('values', function() {
dataValues.forEach(function(datum) { test_value(datum); });
});

7
test/values.json Normal file
View File

@ -0,0 +1,7 @@
[
[ "0", "0" ],
[ "1.0", "100000000" ],
[ "0.1", "10000000" ],
[ ".1", "10000000" ],
[ "0.0005", "50000" ]
]

View File

@ -107,6 +107,49 @@ var formatValue = exports.formatValue = function (valueBuffer) {
return integerPart+"."+decimalPart;
};
var reFullVal = /^\s*(\d+)\.(\d+)/;
var reFracVal = /^\s*\.(\d+)/;
var reWholeVal = /^\s*(\d+)/;
function padFrac(frac)
{
while (frac.length < 8)
frac = frac + '0';
return frac;
}
function parseFullValue(res)
{
return bignum(res[1]).mul('100000000').add(padFrac(res[2]));
}
function parseFracValue(res)
{
return bignum(padFrac(res[1]));
}
function parseWholeValue(res)
{
return bignum(res[1]).mul('100000000');
}
exports.parseValue = function parseValue(valueStr)
{
var res = valueStr.match(reFullVal);
if (res)
return parseFullValue(res);
res = valueStr.match(reFracVal);
if (res)
return parseFracValue(res);
res = valueStr.match(reWholeVal);
if (res)
return parseWholeValue(res);
return undefined;
};
var pubKeyHashToAddress = exports.pubKeyHashToAddress = function (pubKeyHash, addressVersion) {
if (!pubKeyHash) return "";